APIInventory velocity

Get the Inventory Velocity report

GET
/public/v1/reports/inventory-velocity

Returns one row per product sold in the last 365 days with its sales over six windows, a daily demand rate, how many days its stock lasts and, given lead_time_days, when to reorder it and how much to order. This is a read-only snapshot computed at request time; it never changes inventory or purchases, and does not touch compliance systems (Metrc/BioTrack). Use it to plan purchases.

How the figures are built: • Sales are sales order lines (samples included) on orders in every status except Canceled and Merged (MERGED is not accepted; use statuses to narrow it), net of their returns. A return counts on the original order's date, whatever the return's status. • Sales count every order in your company, even when your API key's user may only view their own or their team's orders: reorder planning needs company-wide demand, and the report sits behind its own permission. • Every sales window ends yesterday in the company's timezone: today's partial sales are left out. • The demand rate (average_daily_sold) is half the 30-day average plus half the 365-day average, never below 0. Every forward figure divides by it, and is null when it is 0. • quantity_available is active minus reserved stock, the same figure as available_quantity in GET /public/v1/reports/inventory-valuation for the same location_ids and user_ids. quantity_incoming is the quantity still to receive on open purchases dated within stale_incoming_days; older ones count in stale_incoming_quantity and are left out of every forward figure. • Without lead_time_days no row gets a reorder point, reorder date or suggested quantity, and every reorder_status is UNKNOWN.

Only active products are listed, and only those with at least one sale in the last 365 days. Numeric cells are returned as plain strings (no $ or ,), dates as M/D/YYYY, and a value that does not apply as null. Report-level information (the generation date and the column definitions) is returned under meta. Every matching product is returned in one response; there is no pagination. Rows come back ordered by reorder_by_date, soonest first, with rows that have none last.

Each row also carries the IDs of the records it names — product_id, product_category_id, vendor_id and brand_id, each right after its name column — so a row can be followed to the product or company endpoints without a name lookup. The CSV export leaves these ID columns out.

Required permission: reports_permissions_inventory_velocity. The report must also be turned on for your company; until it is, the endpoint returns 403.

Authorization

Bearer
headerAuthorizationBearer <token>

API token generated in Distru (Settings → Distru API). Send it on every request as Authorization: Bearer YOUR_API_TOKEN.

Query Parameters

lead_time_days?integer

Days from placing a purchase order to receiving it, 1 to 365. Sets the reorder point, reorder_by_date, reorder_status and the suggested quantities. When omitted, those are null and every reorder_status is UNKNOWN.

target_days_of_supply?integer

Days of demand an order should cover, 1 to 365. Defaults to 30. Sizes suggested_order_quantity and suggested_order_quantity_at_reorder_date.

service_level?integer

The percentile of past demand over a lead_time_days-long stretch that the reorder point covers, 50 to 99. Defaults to 95. Higher means fewer stockouts and more stock.

no_sales_after_days?integer

Days without a sale after which a product's reorder_status is NO_RECENT_SALES, with no reorder date or suggested quantity, 0 to 365. Defaults to 60. 0 turns the check off.

stale_incoming_days?integer

Age in days, 1 to 3650, after which an open purchase counts in stale_incoming_quantity instead of quantity_incoming. Defaults to 90.

search?string

Keeps only products that match the term. Matching is case-insensitive: a product is kept when the term appears anywhere in its name or SKU, or when the term is a close fuzzy match on the name. Omit (or pass empty) to keep every product.

product_ids[]?array<string>

Keeps only these products, by product ID. At most 200. Omit to keep every product.

location_ids[]?array<string>

Counts only sales shipped from, stock at and purchase lines received at these locations, by location ID. Combined with user_ids as a union: a sale, stock or purchase line counts if it is at any listed location OR belongs to any listed user. At most 200. Omit both to count every location and user.

user_ids[]?array<string>

Counts only sales, stock and purchase lines belonging to these users, by user ID. Combined with location_ids as a union (see that param). At most 200.

statuses[]?array<>

Counts only sales on orders in these statuses. Values are SCREAMING_CASE and combine with OR. At most 200. When omitted, every status except Canceled and Merged counts (MERGED is not accepted).

below_reorder_point?boolean

true keeps only rows at or below their reorder point; false keeps only rows above it. Either way a row with no reorder point is left out. Omit to keep both.

below_quantity_available_threshold_min?boolean

true keeps only rows at or below the product's inventory alert minimum; false keeps only rows above it. Either way a product with no minimum is left out. Omit to keep both.

max_days_of_supply?integer

Keeps only rows whose days_of_supply is at most this many days, 0 to 36500. A row with no days_of_supply (a demand rate of 0) is left out.

product_category_ids[]?array<string>

Keeps only products in these categories, by product category ID. Combines with product_subcategory_ids as one OR, except that listing a subcategory of a listed category narrows that category to the listed subcategories. At most 200.

product_subcategory_ids[]?array<string>

Keeps only products in these subcategories, by product subcategory ID. See product_category_ids. At most 200.

product_tag_ids[]?array<string>

Keeps only products carrying at least one of these tags, by tag ID. At most 200.

vendor_ids[]?array<string>

Keeps only products supplied by these vendors, by company ID. At most 200.

brand_ids[]?array<string>

Keeps only products under these brands, by company ID. At most 200.

product_group_ids[]?array<string>

Keeps only products in these product groups, by product group ID. At most 200.

Response Body

The Inventory Velocity report

*/*
  1. response

The Inventory Velocity report

data*array<>

The report rows

meta*

Report-level metadata

Example Request
curl -X GET 'https://app.distru.com/public/v1/reports/inventory-velocity?lead_time_days=2'
Example Response
{  "data": [    {      "average_daily_sold": "39.5000",      "average_daily_sold_120": "18.2500",      "average_daily_sold_180": "12.1667",      "average_daily_sold_30": "73.0000",      "average_daily_sold_365": "6.0000",      "average_daily_sold_60": "36.5000",      "average_daily_sold_90": "24.3333",      "below_quantity_available_threshold_min": true,      "below_reorder_point": true,      "brand": null,      "brand_id": null,      "category": "Some category 476",      "confidence": "MEDIUM",      "confidence_reasons": "the 30–180 day rates disagree (spread 0.66)",      "days_of_supply": "0.3",      "days_of_supply_with_incoming": "0.3",      "distinct_orders": "12",      "estimated_stockout_date": "11/3/2026",      "last_sold_at": "11/2/2026",      "lead_time_days": "2",      "name": "P4",      "product_category_id": "00000000-0000-0000-0000-000000002c6e",      "product_id": "7e1c0a52-0000-4000-8000-000000000004",      "quantity_available": "10.00",      "quantity_available_threshold_max": null,      "quantity_available_threshold_min": "50.00",      "quantity_incoming": "0.00",      "quantity_sold_120": "2190.00",      "quantity_sold_180": "2190.00",      "quantity_sold_30": "2190.00",      "quantity_sold_365": "2190.00",      "quantity_sold_60": "2190.00",      "quantity_sold_90": "2190.00",      "reorder_by_date": "11/3/2026",      "reorder_point": "365.00",      "reorder_point_source": "CALCULATED",      "reorder_status": "LATE",      "service_level": "95",      "sku": "S4",      "stale_incoming_quantity": "0.00",      "suggested_cases": null,      "suggested_order_quantity": "1540.00",      "suggested_order_quantity_at_reorder_date": null,      "unit_type": "Gram",      "units_per_case": null,      "vendor": "Company 1780",      "vendor_id": "00000000-0000-0000-0000-000000004336"    },    {      "average_daily_sold": "0.1263",      "average_daily_sold_120": "0.0583",      "average_daily_sold_180": "0.0389",      "average_daily_sold_30": "0.2333",      "average_daily_sold_365": "0.0192",      "average_daily_sold_60": "0.1167",      "average_daily_sold_90": "0.0778",      "below_quantity_available_threshold_min": null,      "below_reorder_point": true,      "brand": null,      "brand_id": null,      "category": "Some category 478",      "confidence": "LOW",      "confidence_reasons": "fewer than 5 orders in the last 365 days; only 1 sale days in the last 365 days: expect to cover roughly 60% of demand; the 30–180 day rates disagree (spread 0.66)",      "days_of_supply": "0.0",      "days_of_supply_with_incoming": "0.0",      "distinct_orders": "1",      "estimated_stockout_date": "11/3/2026",      "last_sold_at": "11/2/2026",      "lead_time_days": "2",      "name": "P5",      "product_category_id": "00000000-0000-0000-0000-000000002c70",      "product_id": "7e1c0a52-0000-4000-8000-000000000005",      "quantity_available": "0.00",      "quantity_available_threshold_max": null,      "quantity_available_threshold_min": null,      "quantity_incoming": "0.00",      "quantity_sold_120": "7.00",      "quantity_sold_180": "7.00",      "quantity_sold_30": "7.00",      "quantity_sold_365": "7.00",      "quantity_sold_60": "7.00",      "quantity_sold_90": "7.00",      "reorder_by_date": "11/3/2026",      "reorder_point": "0.25",      "reorder_point_source": "MIN",      "reorder_status": "LATE",      "service_level": "95",      "sku": "S5",      "stale_incoming_quantity": "0.00",      "suggested_cases": null,      "suggested_order_quantity": "4.04",      "suggested_order_quantity_at_reorder_date": null,      "unit_type": "Gram",      "units_per_case": null,      "vendor": "Company 1783",      "vendor_id": "00000000-0000-0000-0000-000000004337"    },    {      "average_daily_sold": "39.5000",      "average_daily_sold_120": "18.2500",      "average_daily_sold_180": "12.1667",      "average_daily_sold_30": "73.0000",      "average_daily_sold_365": "6.0000",      "average_daily_sold_60": "36.5000",      "average_daily_sold_90": "24.3333",      "below_quantity_available_threshold_min": null,      "below_reorder_point": false,      "brand": null,      "brand_id": null,      "category": "Some category 466",      "confidence": "MEDIUM",      "confidence_reasons": "the 30–180 day rates disagree (spread 0.66)",      "days_of_supply": "12.7",      "days_of_supply_with_incoming": "15.2",      "distinct_orders": "12",      "estimated_stockout_date": "11/15/2026",      "last_sold_at": "11/2/2026",      "lead_time_days": "2",      "name": "P2",      "product_category_id": "00000000-0000-0000-0000-000000002c64",      "product_id": "c11ef2b2-ba19-4b6c-ab27-ca80ea9d513d",      "quantity_available": "500.00",      "quantity_available_threshold_max": null,      "quantity_available_threshold_min": null,      "quantity_incoming": "100.00",      "quantity_sold_120": "2190.00",      "quantity_sold_180": "2190.00",      "quantity_sold_30": "2190.00",      "quantity_sold_365": "2190.00",      "quantity_sold_60": "2190.00",      "quantity_sold_90": "2190.00",      "reorder_by_date": "11/8/2026",      "reorder_point": "365.00",      "reorder_point_source": "CALCULATED",      "reorder_status": "ORDER_SOON",      "service_level": "95",      "sku": "S2",      "stale_incoming_quantity": "0.00",      "suggested_cases": null,      "suggested_order_quantity": "950.00",      "suggested_order_quantity_at_reorder_date": "1185.00",      "unit_type": "Gram",      "units_per_case": null,      "vendor": "Company 1766",      "vendor_id": "00000000-0000-0000-0000-000000004328"    },    {      "average_daily_sold": "39.5000",      "average_daily_sold_120": "18.2500",      "average_daily_sold_180": "12.1667",      "average_daily_sold_30": "73.0000",      "average_daily_sold_365": "6.0000",      "average_daily_sold_60": "36.5000",      "average_daily_sold_90": "24.3333",      "below_quantity_available_threshold_min": null,      "below_reorder_point": false,      "brand": "Company 1753",      "brand_id": "00000000-0000-0000-0000-000000004322",      "category": "Some category 458",      "confidence": "MEDIUM",      "confidence_reasons": "the 30–180 day rates disagree (spread 0.66)",      "days_of_supply": "25.3",      "days_of_supply_with_incoming": "25.3",      "distinct_orders": "12",      "estimated_stockout_date": "11/28/2026",      "last_sold_at": "11/2/2026",      "lead_time_days": "2",      "name": "P1",      "product_category_id": "00000000-0000-0000-0000-000000002c5c",      "product_id": "5e4a668f-f683-452c-b368-56020f3216ea",      "quantity_available": "1000.00",      "quantity_available_threshold_max": null,      "quantity_available_threshold_min": null,      "quantity_incoming": "0.00",      "quantity_sold_120": "2190.00",      "quantity_sold_180": "2190.00",      "quantity_sold_30": "2190.00",      "quantity_sold_365": "2190.00",      "quantity_sold_60": "2190.00",      "quantity_sold_90": "2190.00",      "reorder_by_date": "11/19/2026",      "reorder_point": "365.00",      "reorder_point_source": "CALCULATED",      "reorder_status": "OK",      "service_level": "95",      "sku": "S1",      "stale_incoming_quantity": "0.00",      "suggested_cases": null,      "suggested_order_quantity": "550.00",      "suggested_order_quantity_at_reorder_date": "1185.00",      "unit_type": "Gram",      "units_per_case": null,      "vendor": "Company 1747",      "vendor_id": "00000000-0000-0000-0000-00000000431c"    },    {      "average_daily_sold": "1.0000",      "average_daily_sold_120": "6.0833",      "average_daily_sold_180": "4.0556",      "average_daily_sold_30": "0.0000",      "average_daily_sold_365": "2.0000",      "average_daily_sold_60": "0.0000",      "average_daily_sold_90": "0.0000",      "below_quantity_available_threshold_min": false,      "below_reorder_point": false,      "brand": null,      "brand_id": null,      "category": "Some category 471",      "confidence": "LOW",      "confidence_reasons": "fewer than 5 orders in the last 365 days; only 1 sale days in the last 365 days: expect to cover roughly 60% of demand; the 30–180 day rates disagree (spread 1.26); no sale in the last 60 days",      "days_of_supply": "20.0",      "days_of_supply_with_incoming": "20.0",      "distinct_orders": "1",      "estimated_stockout_date": "11/23/2026",      "last_sold_at": "7/26/2026",      "lead_time_days": "2",      "name": "P3",      "product_category_id": "00000000-0000-0000-0000-000000002c69",      "product_id": "3ac281d8-2ab7-4771-aeac-11dd08555b32",      "quantity_available": "20.00",      "quantity_available_threshold_max": null,      "quantity_available_threshold_min": "10.00",      "quantity_incoming": "0.00",      "quantity_sold_120": "730.00",      "quantity_sold_180": "730.00",      "quantity_sold_30": "0.00",      "quantity_sold_365": "730.00",      "quantity_sold_60": "0.00",      "quantity_sold_90": "0.00",      "reorder_by_date": null,      "reorder_point": "12.00",      "reorder_point_source": "MIN",      "reorder_status": "NO_RECENT_SALES",      "service_level": "95",      "sku": "S3",      "stale_incoming_quantity": "0.00",      "suggested_cases": null,      "suggested_order_quantity": null,      "suggested_order_quantity_at_reorder_date": null,      "unit_type": "Gram",      "units_per_case": null,      "vendor": "Company 1773",      "vendor_id": "00000000-0000-0000-0000-000000004330"    }  ],  "meta": {    "columns": [      {        "key": "name",        "label": "Name"      },      {        "key": "product_id",        "label": "Product ID"      },      {        "key": "sku",        "label": "SKU"      },      {        "key": "unit_type",        "label": "Unit Type"      },      {        "key": "category",        "label": "Category"      },      {        "key": "product_category_id",        "label": "Product Category ID"      },      {        "key": "vendor",        "label": "Vendor"      },      {        "key": "vendor_id",        "label": "Vendor ID"      },      {        "key": "brand",        "label": "Brand"      },      {        "key": "brand_id",        "label": "Brand ID"      },      {        "key": "quantity_sold_30",        "label": "Quantity Sold (30)"      },      {        "key": "average_daily_sold_30",        "label": "Average Daily Sold (30)"      },      {        "key": "quantity_sold_60",        "label": "Quantity Sold (60)"      },      {        "key": "average_daily_sold_60",        "label": "Average Daily Sold (60)"      },      {        "key": "quantity_sold_90",        "label": "Quantity Sold (90)"      },      {        "key": "average_daily_sold_90",        "label": "Average Daily Sold (90)"      },      {        "key": "quantity_sold_120",        "label": "Quantity Sold (120)"      },      {        "key": "average_daily_sold_120",        "label": "Average Daily Sold (120)"      },      {        "key": "quantity_sold_180",        "label": "Quantity Sold (180)"      },      {        "key": "average_daily_sold_180",        "label": "Average Daily Sold (180)"      },      {        "key": "quantity_sold_365",        "label": "Quantity Sold (365)"      },      {        "key": "average_daily_sold_365",        "label": "Average Daily Sold (365)"      },      {        "key": "average_daily_sold",        "label": "Average Daily Sold"      },      {        "key": "distinct_orders",        "label": "Distinct Orders"      },      {        "key": "last_sold_at",        "label": "Last Sold At"      },      {        "key": "confidence",        "label": "Confidence"      },      {        "key": "confidence_reasons",        "label": "Confidence Reasons"      },      {        "key": "quantity_available",        "label": "Quantity Available"      },      {        "key": "quantity_incoming",        "label": "Quantity Incoming"      },      {        "key": "stale_incoming_quantity",        "label": "Stale Incoming Quantity"      },      {        "key": "quantity_available_threshold_min",        "label": "Quantity Available Threshold Min"      },      {        "key": "quantity_available_threshold_max",        "label": "Quantity Available Threshold Max"      },      {        "key": "below_quantity_available_threshold_min",        "label": "Below Quantity Available Threshold Min"      },      {        "key": "units_per_case",        "label": "Units Per Case"      },      {        "key": "days_of_supply",        "label": "Days Of Supply"      },      {        "key": "days_of_supply_with_incoming",        "label": "Days Of Supply With Incoming"      },      {        "key": "estimated_stockout_date",        "label": "Estimated Stockout Date"      },      {        "key": "lead_time_days",        "label": "Lead Time Days"      },      {        "key": "service_level",        "label": "Service Level"      },      {        "key": "reorder_point",        "label": "Reorder Point"      },      {        "key": "reorder_point_source",        "label": "Reorder Point Source"      },      {        "key": "below_reorder_point",        "label": "Below Reorder Point"      },      {        "key": "reorder_by_date",        "label": "Reorder By Date"      },      {        "key": "reorder_status",        "label": "Reorder Status"      },      {        "key": "suggested_order_quantity",        "label": "Suggested Order Quantity"      },      {        "key": "suggested_order_quantity_at_reorder_date",        "label": "Suggested Order Quantity At Reorder Date"      },      {        "key": "suggested_cases",        "label": "Suggested Cases"      }    ],    "date_range": "Nov  3, 2026",    "report": "inventory_velocity"  }}