List Supplier Price List
GET/api/suppliers/:supplier/price-list
Paginated price list for one supplier: every product this supplier can supply, joined against the chosen retail pricing tier and the chosen supplier cost tier, with the margin between them pre-computed in five conventions.
Authentication: Requires Bearer token (scope: suppliers)
Each row's margin object restates the same gap five ways so the caller does not have to:
margin_pct— (retail - cost) / retailoff_retail_pct— the same number read as a discount off the retail list pricecost_ratio_pct— cost / retailmarkup_pct— (retail - cost) / costmultiplier— retail / costamount— retail - cost, in the retail tier's currency
Every margin field is null when either side is missing or the retail price is zero, so unpriced products never produce a misleading 100%.
Tiers: when sell_tier_id / cost_tier_id are omitted the account's default retail and default supplier tiers are used. Call the metadata endpoint for the selectable tiers, the supplier's brands, and the column catalogue.
Filtering
Filters are sent as filter[<name>] query parameters.
Quick filters:
filter[search]— partial match across SKU, product name, barcode, MPN and supplier SKUfilter[brand_id]— one or more brand ids, comma separated. Valid ids come from the metadata endpointfilter[only_priced]—1keeps only products carrying both a retail price and a supplier cost on the selected tiersfilter[archived]—active(default),onlyfor archived products only,allfor both
Column filters take the form filter[<column>.<operator>], for example filter[sku.starts_with]=CB-, filter[margin_pct.greater_than]=50, filter[cost_price.between]=10,50.
- Text columns — sku, name, barcode, mpn, hts_code, brand_name, supplier_sku. 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
- Numeric columns — sell_price, cost_price, margin_amount, margin_pct, off_retail_pct, markup_pct, multiplier, minimum_order_quantity, leadtime, case_quantity, on_hand_quantity, weight. Operators: is, is_not, is_one_of, is_not_one_of, greater_than, greater_than_or_equal, less_than, less_than_or_equal, between, is_empty, is_not_empty
- Boolean columns — is_default_supplier, archived. Operator:
is(andis_notfor archived)
For AND/OR logic and nested groups, send filter_groups instead: a base64-encoded JSON tree of the shape {"conjunction":"and","children":[{"type":"condition","condition":{"column":"margin_pct","operator":"greater_than","value":50}}]}. A children entry may also be {"type":"group","group":{...}} to nest a sub-group with its own conjunction. Conditions naming a column or operator that is not listed above are ignored.
Archived products are excluded unless the archived scope says otherwise.
Request
Responses
- 200
- 401
- 403
- 404
- 422
- 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.
Unprocessable Entity
Response Headers
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.