---
title: "Lists items (templates) with pricing and total on-hand."
method: GET
path: "/api/v1/items"
tags: ["Items"]
---

# Lists items (templates) with pricing and total on-hand.

`GET /api/v1/items`

## Request

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

Requires `ViewInventory`. Draft and deleted templates are excluded.
Cursor-paginated: pass the last item's `syncId` as `after`.
Also available as CSV (`Accept: text/csv` or `?format=csv`); paging cursor in `X-Next-Cursor`.

## Query parameters

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

## Response `200`

One page of items.

- PagedResponseOfItemSummary: One page of a cursor-paginated /api/v1 collection (API_AND_MCP.md: `?after=<syncId>&limit=`).
  - `items` ItemSummary[]: Items of this page in ascending creation order.
    - `id` integer: Numeric id, usable in `/api/v1/items/{id}`.
    - `syncId` string, uuid: Stable cross-device id; also the pagination cursor.
    - `name` string: Display name.
    - `description` string, nullable: Free-text description, if any.
    - `categoryId` integer, nullable: Primary category id, if any.
    - `categoryName` string, nullable: Primary category name, if any.
    - `unitPrice` number, double, nullable: Selling price from the template's `Unit Price` property; null when not priced.
    - `cost` number, double, nullable: Purchase cost from the template's `Cost` property; null when unknown.
    - `onHand` number, double: Units on hand across stock locations (job sites excluded). Decimal because items sold by sub-unit report partial rows; negative when the organization allows overselling.
    - `isMiscItem` boolean: True for ad-hoc "misc" items that never carry stock.
    - `isParentTemplate` boolean: True for a grouping template whose children are the stocked variants.
    - `sellByUnits` boolean: True when the item is sold in sub-units of a parent row.
    - `unitName` string, nullable: Name of the sub-unit when SellByUnits is true.
    - `createdAt` string, date-time: UTC creation time.
    - `updatedAt` string, date-time, nullable: UTC last modification time; null when never edited.
    - `preferredVendorId` integer, nullable: Id of the vendor this item is normally reordered from (see `GET /api/v1/vendors`); null when none is set. Set on Item Templates → Edit or with `PATCH /api/v1/items/{id}`. Example: `3`.
    - `preferredVendorName` string, nullable: Name of the preferred vendor; null when none is set. Example: `"Ferguson"`.
    - `vendorPartNumber` string, nullable: The vendor's own part / catalogue number for this item, max 100 characters; null when unknown. Example: `"PX-12C"`.
  - `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`: Unknown `after` cursor.
- `401`: Unauthorized
- `403`: Forbidden
- `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)
