---
title: "Lists an item's inventory units with their per-unit property values, one page at a time."
method: GET
path: "/api/v1/items/{id}/units"
tags: ["ItemUnits"]
---

# Lists an item's inventory units with their per-unit property values, one page at a time.

`GET /api/v1/items/{id}/units`

## Request

- Base URL: `https://app.flexonthejob.com`
- URL: `https://app.flexonthejob.com/api/v1/items/{id}/units`
- Auth: HTTP bearer

Requires `ViewInventory`. Every active unit is listed, including units in transit, at
job sites and in bundles (see `status`). Example:
`GET /api/v1/items/12/units?locationId=3` returns the units held at location 3.
Also available as CSV (`Accept: text/csv` or `?format=csv`; `properties` is
one JSON cell); paging cursor in `X-Next-Cursor`.

## Path parameters

- `id` integer, required

## Query parameters

- `locationId` integer
- `updatedSince` string, date-time
- `after` string
- `limit` integer
- `format` 'csv'

## Response `200`

A page of units.

- PagedResponseOfItemUnitDto: One page of a cursor-paginated /api/v1 collection (API_AND_MCP.md: `?after=<syncId>&limit=`).
  - `items` ItemUnitDto[]: Items of this page in ascending creation order.
    - `id` integer: Unit id, e.g. `5012`; used by `PUT /api/v1/items/{id}/units/{unitId}/properties/{name}`.
    - `syncId` string, uuid: Globally unique sync id (GUID). Use it as the `after` pagination cursor.
    - `name` string: The unit's display name (normally the item's name).
    - `status` 'Available' | 'InTransit' | 'AtJobSite' | 'InBundle': Where an inventory unit stands, derived from its location and transfer state.
    - `locationId` integer, nullable: Id of the location holding the unit (see `GET /api/v1/locations`); null when it has none.
    - `locationName` string, nullable: Name of that location; null when the unit has none.
    - `createdAt` string, date-time: UTC creation timestamp (ISO-8601) — when the unit entered stock.
    - `updatedAt` string, date-time, nullable: UTC timestamp of the unit's last edit or move, including a change to one of its custom-field values; null when never changed.
    - `properties` ItemUnitPropertyDto[]: The unit's custom-field values, ordered by name. Includes `Cost` (the unit's own cost) and the pricing copy `Unit Price`, flagged `isPricing`.
      - `id` integer: The unit's property id, e.g. `88213` (differs from the item's property id).
      - `name` string: Property name, e.g. `"Color"`; the `{name}` of the per-unit PUT.
      - `value` string: The unit's value as stored, never null (`""` = none); formats as on `GET /api/v1/items/{id}/properties`.
      - `dataType` 'Text' | 'Number' | 'Date' | 'Boolean' | 'Dropdown' | 'MultiSelect'
      - `isCalculated` boolean: True when the value comes from a calculation on this unit; such values cannot be set (`409`).
      - `isCustomized` boolean: True when the value was set on this unit and no longer follows the item's value.
      - `isItemLevel` boolean: True when the property does not come from the item's Item Template (an item-level property of the item, or one added on this unit).
      - `isPricing` boolean: True for `Cost` and `Unit Price`, which cannot be set per unit through the API (`409`).
  - `nextCursor` string, nullable: SyncId of the last item; pass it back as `?after=` to fetch the next page. `null` when this is the last page.

## Other responses

- `400`: Malformed `after` cursor.
- `401`: Unauthorized
- `403`: Forbidden
- `404`: No such active item in this organization.
- `429`: Too Many Requests

---

[API](https://skmtc.dev/flexonthejob/apis/flex-api.md) · [All operations](https://skmtc.dev/flexonthejob/apis/flex-api/llms.txt) · [OpenAPI document](https://skmtc.dev/flexonthejob/apis/flex-api/revisions/19c8f4d27acf?raw)
