Preview Bulk Listing Pricing
POST/api/v2/listings/bulk-edit-pricing-preview
Dry run for Bulk Update Listing Pricing. For every targeted listing it resolves the Master of Price and pricing level the listing is priced from today, what it would be priced from after the change, the price that results, and what the next price push would do with that figure under the channel's current guardrails. Nothing is written.
products:writeGrant this scope to your token under Settings → Developer → Personal Access Tokens.
Targeting (one of):
- ids (array of integers, required unless apply_to_all is true) — explicit listing IDs
- apply_to_all (boolean) — target every listing matching the optional filters object
filters (object, used with apply_to_all) — the same filters the listings list accepts, as bare keys:
- search (string) — listing SKU, title, channel listing ID, product SKU or product name
- integration_id (integer), integration_instance_id (integer)
- is_fba (true/false)
- has_product (true/false) — listings linked (or not) to a product
- archived — omit for active listings only; true for archived listings only; all for both
- filter_groups (object) — an advanced filter tree: {"conjunction": "and", "children": [{"type": "condition", "condition": {"column": "price", "operator": "greater_than", "value": 20}}]}. Columns: id, listing_sku, title, sales_channel_listing_id, price, integration_id, is_fba, created_at, updated_at, plus channel document fields (doc_amazon_asin, doc_amazon_brand, doc_amazon_status, doc_shopify_status, doc_shopify_vendor, doc_walmart_published_status, doc_woocommerce_status, doc_ebay_listing_status, doc_bigcommerce_type and their siblings). Operators: is, is_not, contains, does_not_contain, starts_with, ends_with, is_empty, is_not_empty, is_one_of, greater_than, less_than, between.
pricing (required, object):
- inherit (boolean) — when true, clears the listing's own Master of Price and pricing level so it inherits both from its channel; master_of_price and product_pricing_tier_id are then ignored
- master_of_price (string, required unless inherit is true) — one of: sku.io, sales_channel, neither (case-insensitive)
- product_pricing_tier_id (integer, required when master_of_price is sku.io) — the pricing level to pin the listing to; ignored for any other master
Response fields:
- total_listings, will_change, unchanged — how many listings the change touches
- fba_listings — how many of them are FBA listings
- push — counts of what the next price push would do with the new prices: would_push, blocked (a guardrail refuses the price), unchanged (the channel already has that price), not_pushed (SKU.io would not own the price, no level prices the product, or the channel has no price push)
- truncated, row_limit — counts are always complete; rows are capped at row_limit (500) and truncated says whether any were left out
- rows[] — one per listing: id, listing_sku, title, channel_name, is_fba, will_change, current and new (each with master_of_price, is_override, tier_id, tier_name, price and scope — listing for the listing's own pinned level, fulfillment for a fulfillment-channel lane such as Amazon MFN, channel for the channel sequence, null when no level prices it), push (state, last_pushed_price, detail) and warning (a per-row caution, e.g. an FBA listing being pinned to a level even though a fulfillment lane never prices it)
Authentication: Requires Bearer token.
Request
Responses
- 200
- 401
- 403
- 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.
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.