Get products
Returns a paginated list of products, oldest first (ascending by creation time). Soft-deleted products are excluded unless you opt into them with the deleted filter. The response is a {data, next_page} envelope; follow next_page (null on the last page) to walk every page.
This endpoint is eventually consistent: a create or update made through the API can take up to about one second to appear or change here, so a product you just wrote may briefly be missing or stale in the list.
Required permission: products_permissions_view. Results are additionally limited to the products the authenticated user can see under their team restrictions, so two API keys at the same company can return different sets.
Query parameters
Case-insensitive substring match on the product's name. Omit to match products of any name.
Case-insensitive substring match on the product's SKU. Omit to match products of any SKU.
Case-insensitive substring match on the product's UPC. Omit to match products of any UPC.
Restrict to products whose name exactly matches (case-insensitive) any value in the list. Repeat the bracketed key once per value.
Restrict to products whose SKU exactly matches (case-insensitive) any value in the list. Repeat the bracketed key once per value.
Restrict to products whose UPC exactly matches (case-insensitive) any value in the list. Repeat the bracketed key once per value.
Distru menu IDs; a product is returned if it belongs to any one of them (OR). Repeat the bracketed key once per value. IDs that don't resolve to a menu in your company are ignored; if that leaves no valid menu ID, data comes back empty rather than unfiltered. At most 200 IDs may be given.
DEPRECATED — use menu_ids[] instead; the comma form will be removed in a future version. Comma-separated Distru menu IDs; a product is returned if it belongs to any one of them (OR). Tokens that don't resolve to a menu in your company are ignored; if that leaves no valid menu ID, data comes back empty rather than unfiltered.
Case-insensitive substring match on the name of a menu the product belongs to. When combined with menu_ids, both must hold (AND).
Filter by product creation time. A comma-separated after,before pair of ISO8601 UTC datetimes, both bounds inclusive. Leave either side empty to make that bound open-ended: 2022-07-10T00:00:00Z, returns products created at or after that instant, ,2022-07-10T00:00:00Z returns those created at or before it.
Whether to include soft-deleted products. no (the default) returns only non-deleted products, only returns only soft-deleted ones, include returns both. Note these values are lower-case, unlike response enums.
Restrict the result to specific products by ID (the same ID returned as each product's id). Repeat the bracketed key once per ID. Unknown IDs simply match nothing; an empty list is treated as no filter.
Restrict to products in any of these categories (the same ID returned as each product's category.id). Repeat the bracketed key once per ID. IDs that don't resolve match nothing.
Restrict to products in any of these subcategories (the same ID returned as each product's subcategory.id). Repeat the bracketed key once per ID.
Restrict to products in any of these groups (the same ID returned as each product's product_group.id). Repeat the bracketed key once per ID.
Restrict to products with any of these brands (the same ID returned as each product's brand.id). Repeat the bracketed key once per ID.
Restrict to products with any of these strains (the same ID returned as each product's strain.id). Repeat the bracketed key once per ID.
Restrict to products carrying any of these tags (the same ID returned in each product's tags[].id). Repeat the bracketed key once per ID.
Restrict to products supplied by any of these vendors (the same ID returned as each product's vendor.id). This is the company-relationship ID, not the raw company ID. Repeat the bracketed key once per ID.
Restrict to products owned by any of these users (the same ID returned as each product's owner.id). Repeat the bracketed key once per ID.
Restrict to products with any of these unit types (the same ID returned as each product's unit_type.id). Repeat the bracketed key once per ID.
Restrict to products whose strain is of any of these types. Repeat the bracketed key once per value. SCREAMING_CASE.
Restrict to products linked to any of these LeafLink product IDs (the integer leaflink_product_id returned on each product). Repeat the bracketed key once per ID.
Restrict to products with this inventory tracking method (the same value returned as each product's inventory_tracking_method). SCREAMING_CASE.
Restrict to products with this menu visibility (the same value returned as each product's menu_visibility). SCREAMING_CASE.
Restrict to active (true) or inactive (false) products. Omit to match products regardless of active state.
Restrict to featured (true) or non-featured (false) products. Omit to match products regardless of featured state.
Restrict to products that currently hold active inventory quantity (true) or none (false). Omit to match products regardless of active quantity.
Page selector. Page size is fixed by the server; paginate by following the next_page URL in each response rather than building page selectors yourself — it is null on the last page. next_page uses page[after]=<cursor>, an opaque token marking where the next page resumes; pass it back exactly as given, and only to the endpoint that issued it. This is seek-based, so every page stays fast no matter how deep you page.
Filter by the time a product was last modified. Same after,before comma-separated ISO8601 UTC range format as inserted_datetime, both bounds inclusive, either side optional.
When true, each product carries its bill_of_materials object (or null if it has none). Defaults to false, in which case bill_of_materials is omitted entirely to keep the list light.
When true, each product carries packages_with_active_quantity_by_location — its packages that hold active quantity, grouped by location (empty for products that are not package-tracked). Defaults to false, in which case the field is omitted. Because this runs extra per-product queries, setting it (or include_batches_with_active_quantity_by_location) shrinks the page size to 50.
When true, each product carries batches_with_active_quantity_by_location — its batches that hold active quantity, grouped by location, each batch carrying its active quantity at that location (empty for products that are not batch-tracked). Defaults to false, in which case the field is omitted. Because this runs extra per-product queries, setting it (or include_packages_with_active_quantity_by_location) shrinks the page size to 50.
Filter by custom field values, as custom_data[{id}]=value where {id} is a custom field's numeric id. Repeat with different ids to filter on several fields at once; a record must match every one (AND). Matching is case-sensitive exact against the value stored on the record. The id must be a filterable custom field defined on this entity — use GET /public/v1/custom-fields?parent_object=product to list the ids, their types, and which are filterable. A non-numeric id, an id not defined on this entity, or an id that isn't filterable returns a 400.
Response
A list of products
Changes
No recorded changes to this endpoint across all 2 revisions of this API.