# List serial numbers

Operation ID: `serialNumbers`

Group: Inventory › Serial Numbers

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

`GET /inventory/serial-numbers`

Read-only: Reads and returns; changes nothing.

Lists serial numbers, without their costs. For `cost`, `originalCost`, `afterSaleCost`, and `currency`, use POST inventory/serial-numbers/search or GET inventory/serial-numbers/:id.

## 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
- `serialNumber` — filter by eq, ne, gt, gte, lt, lte, in, notIn, between, like
- `manufacturerSerialNumber` — 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
- `locationId` — filter by eq, ne, gt, gte, lt, lte, in, notIn, between, like
- `entityId` — filter by eq, ne, gt, gte, lt, lte, in, notIn, between, like
- `isSold` — filter by eq, ne, gt, gte, lt, lte, in, notIn, between
- `expirationDate` — filter by eq, ne, gt, gte, lt, lte, in, notIn, between
- `active` — filter by eq, ne, gt, gte, lt, lte, in, notIn, between
- `lastModifiedDate` — filter by eq, ne, gt, gte, lt, lte, in, notIn, between
- Orderable: id, serialNumber, expirationDate, lastModifiedDate
- Selectable: id, serialNumber, manufacturerSerialNumber, itemId, itemCode, itemName, locationId, locationCode, locationName, entityId, inStock, isSold, lastCostChangeDate, expirationDate, entryDate, active, createdDate, lastModifiedDate
- `page[size]` — Page size
- `page[cursor]` — Opaque continuation cursor

## Response

`200` Success

Under `data`, an array of serialNumbersRow:

| 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 serial number. Format: UUID. Example: `"c3f80a41-6d29-4b57-8e10-92a4d7b05f63"`. |
| `serialNumber` | string \| null | no | Exact (`eq`, `ne`), Range (`gt`, `gte`, `lt`, `lte`, `between`), Any of (`in`, `notIn`), Pattern (`like`) | yes | The serial number of the unit, such as the one printed on its label. It is entered on the receipt, inventory increase, or other document that first recorded the unit. The same serial number can be used for other items and in other legal entities, so it identifies a unit only together with the item and the legal entity. Example: `"SN-000418"`. |
| `manufacturerSerialNumber` | string \| null | no | Exact (`eq`, `ne`), Range (`gt`, `gte`, `lt`, `lte`, `between`), Any of (`in`, `notIn`), Pattern (`like`) | no | The manufacturer's serial number. |
| `itemId` | string \| null | no | Exact (`eq`, `ne`), Range (`gt`, `gte`, `lt`, `lte`, `between`), Any of (`in`, `notIn`), Pattern (`like`) | no | The unique identifier of the item this serial number belongs to. Format: UUID. See `id` on GET inventory/items/:id (getItem). Example: `"afb4492d-52fc-44c5-ab10-71ad4a615496"`. |
| `itemCode` | string \| null | no | no | no | The code of the item in `itemId`. Example: `"SERIAL-01"`. |
| `itemName` | string \| null | no | no | no | The name of the item in `itemId`. |
| `locationId` | string \| null | no | Exact (`eq`, `ne`), Range (`gt`, `gte`, `lt`, `lte`, `between`), Any of (`in`, `notIn`), Pattern (`like`) | no | The unique identifier of the warehouse the unit is in, or was last in. Format: UUID. See `id` on GET inventory/warehouses/:id (getWarehouse). Example: `"f5272ae0-0f0b-47d2-b78a-2158fec2cc32"`. |
| `locationCode` | string \| null | no | no | no | The code of the warehouse in `locationId`. Example: `"WH-02"`. |
| `locationName` | string \| null | no | no | no | The name of the warehouse in `locationId`. |
| `entityId` | string \| null | no | Exact (`eq`, `ne`), Range (`gt`, `gte`, `lt`, `lte`, `between`), Any of (`in`, `notIn`), Pattern (`like`) | no | The unique identifier of the legal entity the unit belongs to. Format: UUID. See `id` on GET base/entities (entities). |
| `inStock` | decimal \| null | no | no | no | The current quantity of the unit in stock. It is 1 when the unit is in stock and 0 when it is not, including before the unit is received. Example: `"1"`. |
| `isSold` | boolean \| null | no | Exact (`eq`, `ne`), Range (`gt`, `gte`, `lt`, `lte`, `between`), Any of (`in`, `notIn`) | no | Whether the unit has been sold. Example: `false`. |
| `lastCostChangeDate` | date \| null | no | no | no | The date the `cost` or `afterSaleCost` of the unit last changed. It is the date the change was committed, not the date of the document. Format: YYYY-MM-DD. |
| `expirationDate` | date \| null | no | Exact (`eq`, `ne`), Range (`gt`, `gte`, `lt`, `lte`, `between`), Any of (`in`, `notIn`) | yes | The date the unit expires. Format: YYYY-MM-DD. |
| `entryDate` | date \| null | no | no | no | The date the unit's age is counted from. Format: YYYY-MM-DD. When a receipt or inventory increase receives the unit, it is the date entered for the unit on that document, or the document's date when none was entered. Each later receipt or inventory increase for the unit sets a new date. A warehouse transfer does not change the date, including a transfer between legal entities. |
| `active` | boolean \| null | no | Exact (`eq`, `ne`), Range (`gt`, `gte`, `lt`, `lte`, `between`), Any of (`in`, `notIn`) | no | Whether the serial number is active. Example: `true`. |
| `createdDate` | date-time \| null | no | no | no | The date and time the serial number record was created, in UTC. Format: YYYY-MM-DDTHH:mm:ss.sssZ. |
| `lastModifiedDate` | date-time \| null | no | Exact (`eq`, `ne`), Range (`gt`, `gte`, `lt`, `lte`, `between`), Any of (`in`, `notIn`) | yes | The date and time the serial number record last changed, in UTC. Format: YYYY-MM-DDTHH:mm:ss.sssZ. Example: `"2026-08-18T09:14:22.517Z"`. |

```json
{
  "data": [
    {
      "id": "c3f80a41-6d29-4b57-8e10-92a4d7b05f63",
      "serialNumber": "SN-000418",
      "manufacturerSerialNumber": "<manufacturerSerialNumber>",
      "itemId": "afb4492d-52fc-44c5-ab10-71ad4a615496",
      "itemCode": "SERIAL-01",
      "itemName": "<itemName>",
      "locationId": "f5272ae0-0f0b-47d2-b78a-2158fec2cc32",
      "locationCode": "WH-02",
      "locationName": "<locationName>",
      "entityId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
      "inStock": "1",
      "isSold": false,
      "lastCostChangeDate": "2026-01-15",
      "expirationDate": "2026-01-15",
      "entryDate": "2026-01-15",
      "active": true,
      "createdDate": "2026-01-15T09:30:00.000Z",
      "lastModifiedDate": "2026-08-18T09:14:22.517Z"
    }
  ],
  "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
