Get the Inventory Velocity report
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.
BearerAuthorizationBearer <token>API token generated in Distru (Settings → Distru API). Send it on every request as Authorization: Bearer YOUR_API_TOKEN.
lead_time_days?integerDays 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?integerDays 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?integerThe 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?integerDays 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?integerAge in days, 1 to 3650, after which an open purchase counts in stale_incoming_quantity instead of quantity_incoming. Defaults to 90.
search?stringKeeps 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?booleantrue 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?booleantrue 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?integerKeeps 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.
The Inventory Velocity report
*/*- response
The Inventory Velocity report
data*array<>The report rows
meta*Report-level metadata
curl -X GET 'https://app.distru.com/public/v1/reports/inventory-velocity?lead_time_days=2'{ "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" }}