List Product Sales
GET/api/v2/products/:product/sales
List sales order lines for a product — one row per line with parent-order context (order number, date, sales channel, customer, order and fulfillment status) and per-line financials (unit price, line revenue, profit). Draft orders are excluded. Results are live order data.
Authentication: Requires Bearer token.
Filters:
- filter[search] — searches order number and customer name
- filter[sales_channel_id] — exact sales channel ID
- filter[warehouse_id] — exact warehouse ID (line-level)
- filter[order_status] / filter[fulfillment_status] / filter[order_number] / filter[customer_name] — text filters; bare param matches exactly, or suffix an operator, e.g. filter[order_status.is_one_of]=open,closed, filter[order_number.contains]=1234. Operators: contains, does_not_contain, is, is_not, is_one_of, is_not_one_of, starts_with, does_not_start_with, ends_with, does_not_end_with, is_empty, is_not_empty
- filter[
order_date.<operator>] — date filters. Operators: is, is_not, before, after, on_or_before, on_or_after, between, is_empty, is_not_empty, today, yesterday, past_week, past_month, past_year - filter[
quantity.<operator>] / filter[unit_price.<operator>] — numeric filters. Operators: is, is_not, is_one_of, is_not_one_of, greater_than, less_than, greater_than_or_equal, less_than_or_equal, between, is_empty, is_not_empty - filter_groups — base64-encoded JSON tree for grouped AND/OR filter conditions, e.g. {"conjunction":"and","children":[{"type":"condition","condition":{"column":"quantity","operator":"greater_than","value":1}}]}
Allowed sorts: id, order_date, order_number, order_status, fulfillment_status, customer_name, quantity, unit_price. Prefix with - for descending. Default: -order_date.
Pagination: page, per_page (default 15).
Request
Responses
- 200
- 401
- 403
- 404
- 429
OK
Response Headers
Unauthenticated — the bearer token is missing, revoked, expired, or malformed. Never retry automatically; fix the credential. See the Errors guide.
Forbidden — the token lacks a required scope, the endpoint is not available to API tokens, or the user behind the token lacks the permission. A human must adjust the token scopes or user permissions; do not retry.
Not found — no record with the given identifier (or the route does not exist). Verify the ID before retrying.
Rate limited — platform limit is 1,000 requests/min; individual tokens may carry lower limits. Honor the Retry-After header before retrying. See the Rate Limits guide.