For the complete documentation index, see llms.txt. This page is also available as Markdown.

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.

post
/tenants/{tenantUid}/reports/shelf-warmers
Authorizations
AuthorizationstringRequired

Access token recevied after user login with a deviceToken

Path parameters
tenantUidstringRequired

Reference to a tenant.

Pattern: ^[A-Za-z0-9-_]+
Query parameters
pageNumberintegerOptional

Reference to a specific page in a result set.

pageSizeintegerOptional

The number of items per page in a result set.

sortBystringOptional

Defines which field the resource list is sorted by.

sortDirectionstring · enumOptional
ENUMDescription
ASCSort in ascending order
DESCSort in descending order
Possible values:
Body
noActivitySincestring · date-timeRequired

Products with no stock movement after this time are considered shelf warmers.

organizationUidsstring[]Optional
storeUidsstring[]Optional
warehouseUidsstring[]Optional
supplierUidsstring[]Optional
productGroupUidsstring[]Optional

Includes descendant product groups.

categoryUidsstring[]Optional

Includes descendant categories.

brandUidsstring[]Optional
querystringOptional

Free-text search across product SKU and name.

includeStockLayersbooleanOptional

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.

Responses
200

Shelf warmer search results

post/tenants/{tenantUid}/reports/shelf-warmers
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
}
200

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?