---
title: "Retrieve products in demand"
description: "The Products in demand table: variants (or products) ranked by back-in-stock demand, with signups created in the window, how many of them are still waiting, and the last request."
url: https://docs.stoqapp.com/v2-reference/back-in-stock-reports/retrieve-products-in-demand/
api: "API v2 reference"
method: GET
path: "/back_in_stock/reports/products_in_demand"
---

# Retrieve products in demand

`GET https://app.stoqapp.com/api/v2/external/back_in_stock/reports/products_in_demand`

The Products in demand table: variants (or products) ranked by back-in-stock demand, with signups created in the window, how many of them are still waiting, and the last request.

**Note:** The same rows as the dashboard table. total counts signups created in the window; pending counts those of them not yet notified. count_by=customers counts a shopper signed up on several channels once; omitted, it follows the dashboard default, and the response's count_by says which. group_by=product ranks products instead of variants. search matches product title or SKU; vendors, tags and shopify_market_ids are comma-separated lists, as the table's filters. Deleted variants are hidden when the shop's dashboard hides them. image_url is the variant's image, else the product's. Variant rows only: include_inventory=true adds inventory_available, the stock available in the locations the shop's market or location filter allows (summed, null when Shopify has no level), and include_prices=true adds price and compare_at_price in the shop's currency, as the table's Inventory and Price columns. Each asks Shopify once per page. include_totals=true adds totals { pending, total }, the pending and total columns summed over every row the filters keep, not just this page.

## Query parameters

- `group_by` (string) One of: `variant`, `product`.
- `sort_by` (string) One of: `pending`, `total`, `last_requested_at`.
- `direction` (string) One of: `asc`, `desc`.
- `count_by` (string) One of: `customers`, `signups`.
- `from` (string)
- `to` (string)
- `range` (string)
- `shopify_market_ids` (array)
- `search` (string)
- `vendors` (string)
- `tags` (string)
- `page` (string)
- `per_page` (string)
- `include_inventory` (string)
- `include_prices` (string)
- `include_totals` (string)

## Returns

- `window` (object)
  - `from` (string): e.g. `2026-05-26T00:00:00Z`
  - `to` (string): e.g. `2026-06-25T23:59:59Z`
- `group_by` (string): e.g. `variant`
- `sort_by` (string): e.g. `pending`
- `direction` (string): e.g. `desc`
- `count_by` (string): e.g. `customers`
- `rows` (array of objects)
  - `shopify_variant_id` (string): e.g. `gid://shopify/ProductVariant/47284734423096`
  - `shopify_product_id` (string): e.g. `gid://shopify/Product/8784906035384`
  - `variant_title` (string): e.g. `Blue / Medium`
  - `product_title` (string): e.g. `Classic Sneaker`
  - `sku` (string): e.g. `CS-BLU-M`
  - `pending` (integer): e.g. `47`
  - `total` (integer): e.g. `89`
  - `last_requested_at` (string): e.g. `2026-06-25T11:30:00Z`
- `meta` (object)
  - `total_count` (integer): e.g. `287`
  - `page` (integer): e.g. `1`
  - `per_page` (integer): e.g. `50`
  - `total_pages` (integer): e.g. `6`

Rate limit: this call costs 1 point ([rate limits](https://docs.stoqapp.com/docs/rate-limits/)).

## Examples

### Retrieve products in demand

```sh
curl "https://app.stoqapp.com/api/v2/external/back_in_stock/reports/products_in_demand" \
  -H "X-Auth-Token: $STOQ_API_KEY"
```

### Retrieve products in demand filtered by group_by, sort_by and direction

```sh
curl "https://app.stoqapp.com/api/v2/external/back_in_stock/reports/products_in_demand?group_by=variant&sort_by=pending&direction=asc" \
  -H "X-Auth-Token: $STOQ_API_KEY"
```

## 200

Success: example response shown.

```json
{
  "window": {
    "from": "2026-05-26T00:00:00Z",
    "to": "2026-06-25T23:59:59Z"
  },
  "group_by": "variant",
  "sort_by": "pending",
  "direction": "desc",
  "count_by": "customers",
  "rows": [
    {
      "shopify_variant_id": "gid://shopify/ProductVariant/47284734423096",
      "shopify_product_id": "gid://shopify/Product/8784906035384",
      "variant_title": "Blue / Medium",
      "product_title": "Classic Sneaker",
      "sku": "CS-BLU-M",
      "pending": 47,
      "total": 89,
      "last_requested_at": "2026-06-25T11:30:00Z"
    },
    {
      "shopify_variant_id": "gid://shopify/ProductVariant/47284734455864",
      "shopify_product_id": "gid://shopify/Product/8784906035384",
      "variant_title": "Red / Large",
      "product_title": "Classic Sneaker",
      "sku": "CS-RED-L",
      "pending": 23,
      "total": 56,
      "last_requested_at": "2026-06-25T09:15:00Z"
    }
  ],
  "meta": {
    "total_count": 287,
    "page": 1,
    "per_page": 50,
    "total_pages": 6
  }
}
```

## 401

Missing or invalid `X-Auth-Token`.

```json
{
  "errors": [
    "Invalid API key"
  ],
  "code": "auth_invalid",
  "details": [
    {
      "code": "auth_invalid",
      "message": "Invalid API key",
      "path": null,
      "value": null,
      "expected": null
    }
  ]
}
```

## 422

The request failed validation.

```json
{
  "errors": [
    "name is required"
  ],
  "code": "validation_failed",
  "details": [
    {
      "code": "validation_failed",
      "message": "name is required",
      "path": null,
      "value": null,
      "expected": null
    }
  ]
}
```

## 429

Rate limited: cost-weighted per token (read 1, write 2; 360 points / 60s). Check `Retry-After`.

```json
{
  "errors": [
    "Rate limit exceeded"
  ],
  "code": "rate_limited",
  "details": [
    {
      "code": "rate_limited",
      "message": "Rate limit exceeded",
      "path": null,
      "value": null,
      "expected": null
    }
  ]
}
```

