Get the Inventory Velocity report
Changed onReturns 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.
Request
- Base URLhttps://app.distru.com
- AuthHTTP bearer
Query parameters
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.
Days of demand an order should cover, 1 to 365. Defaults to 30. Sizes suggested_order_quantity and suggested_order_quantity_at_reorder_date.
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.
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.
Age in days, 1 to 3650, after which an open purchase counts in stale_incoming_quantity instead of quantity_incoming. Defaults to 90.
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.
Keeps only these products, by product ID. At most 200. Omit to keep every product.
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.
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.
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).
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.
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.
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.
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.
Keeps only products in these subcategories, by product subcategory ID. See product_category_ids. At most 200.
Keeps only products carrying at least one of these tags, by tag ID. At most 200.
Keeps only products supplied by these vendors, by company ID. At most 200.
Keeps only products under these brands, by company ID. At most 200.
Keeps only products in these product groups, by product group ID. At most 200.
Response
The Inventory Velocity report
Changes
- info
endpoint added
- info