Shelf warmers search
Get products whose stock stands still — so-called shelf warmers or dead stock. The condition is judged per warehouse: a warehouse qualifies when it holds stock of the product and that stock has had no movement since noActivitySince. A product is listed when at least one of the matching warehouses qualifies, so stock standing still in one store is reported there even if another store sold the same product yesterday. Quantity in stock, stock value, last received and last stock change count only the warehouses that qualify.
Each JSON row is one product aggregated across the qualifying warehouses, with a per-warehouse breakdown, last sold/received/stock-change dates and supplier info.
Optionally filtered on organization, store, warehouse, supplier, product group (incl. descendants), category (incl. descendants), brand and a free-text search on SKU/name.
Sortable by: stockValue (default, DESC), qtyStock, lastSoldAt, lastReceivedAt, lastStockChangeAt, sku, name.
Set accept header to application/vnd.openxmlformats-officedocument.spreadsheetml.sheet to get the response as an excel file. The export is not paginated and has one row per warehouse and stock-in day rather than one summed row per product, so you can see how long each batch of stock has been standing: stock on hand is traced back to the days it came in, assuming the oldest units are sold first, and a product's rows read oldest stock first. Stock that cannot be traced to a logged movement gets a row without a date, placed last. Columns: SKU, product name, brand, product group, properties, GTINs, suppliers, store, warehouse, stock in, days since stock in, last sold, last stock change, quantity in stock, unit cost, stock value. A report that would exceed 100 000 rows is rejected with a 400 — narrow it with a filter.
"Stock in" is the day the units last entered the warehouse by any movement that added stock — a receive, but also a customer return, a stock count correction, an import, an RMA, a manual adjustment or a transfer in from another store. It is therefore not a goods-receipt date and not the age of the goods: returning or moving a single unit starts the count over for that unit, while the rest of the batch keeps its older day. Use lastReceivedAt for the strict goods-receipt date.
Access token recevied after user login with a deviceToken
Reference to a tenant.
^[A-Za-z0-9-_]+Reference to a specific page in a result set.
The number of items per page in a result set.
Defines which field the resource list is sorted by.
| ENUM | Description |
|---|---|
| ASC | Sort in ascending order |
| DESC | Sort in descending order |
Products with no stock movement after this time are considered shelf warmers.
Includes descendant product groups.
Includes descendant categories.
Free-text search across product SKU and name.
When true, every warehouse in the response carries its stock split over the days it last came in on (oldest first), plus that warehouse's own last sale and last stock movement. Costs two extra queries, so leave it out unless the caller shows the breakdown. Defaults to false.
Shelf warmer search results
POST /v2/tenants/{tenantUid}/reports/shelf-warmers HTTP/1.1
Host: api.flowretail.com
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 258
{
"noActivitySince": "2026-01-01T00:00:00.000Z",
"organizationUids": [
"text"
],
"storeUids": [
"text"
],
"warehouseUids": [
"text"
],
"supplierUids": [
"text"
],
"productGroupUids": [
"text"
],
"categoryUids": [
"text"
],
"brandUids": [
"text"
],
"query": "text",
"includeStockLayers": true
}Shelf warmer search results
{
"items": [
{
"product": {
"productUid": "text",
"sku": "text",
"name": "text",
"brandUid": "text",
"brandName": "text",
"gtins": [
"text"
],
"productGroupUid": "text",
"productGroupName": "text",
"productGroupPath": [
{
"productGroupUid": "text",
"name": "text"
}
],
"categories": [
{
"categoryUid": "text",
"name": "text"
}
],
"properties": [
{
"name": "text",
"value": "text"
}
]
},
"qtyStock": 1,
"stockValue": 1,
"lastSoldAt": "2026-01-01T00:00:00.000Z",
"lastReceivedAt": "2026-01-01T00:00:00.000Z",
"lastStockChangeAt": "2026-01-01T00:00:00.000Z",
"warehouses": [
{
"warehouseUid": "text",
"name": "text",
"store": {
"storeUid": "text",
"name": "text",
"organizationUid": "text",
"organizationName": "text"
},
"qtyStock": 1,
"averageCost": 1,
"stockLayers": [
{
"stockInOn": "2026-01-01",
"qtyStock": 1
}
],
"lastSoldAt": "2026-01-01T00:00:00.000Z",
"lastStockChangeAt": "2026-01-01T00:00:00.000Z"
}
],
"suppliers": [
{
"supplierUid": "text",
"name": "text",
"supplierSku": "text",
"purchasePrice": 1
}
]
}
],
"paging": {
"pageNumber": 1,
"pageSize": 1,
"totalCount": 1
}
}Last updated
Was this helpful?

