List Price Comparison
GET/api/v2/sales-channels/:integrationInstance/prices/comparison
Compare the SKU.io price against the price the channel last reported, listing by listing.
integrations:readGrant this scope to your token under Settings → Developer → Personal Access Tokens.
sku_price is what SKU.io resolves for the listing; channel_price is the price the channel last reported. price_difference and price_difference_pct are SKU.io minus the channel.
Each row carries a status: in_sync (the two agree within half a cent), out_of_sync (they differ), not_priced (SKU.io has no price for the listing), or unknown_channel_price (SKU.io has a price but the channel has never reported one).
master_of_price is the effective value — the per-listing override where one is set, otherwise the channel-level setting.
Supports advanced filter groups via the filter_groups parameter on: listing_sku, external_sku, product_sku, product_name, remote_status, sku_price, channel_price, last_pushed_at.
Authentication: Requires Bearer token.
Requires the integrations.show permission.
Which level priced each listing. Every row carries priced_from_tier_id and priced_from_tier_name — the level the sequence actually drew the price from, or null when no level prices that product. Filter on filter[priced_from] to isolate one level, or none for the unpriced.
Which scope priced each listing. priced_from_scope says where that level came from: listing (the listing's own pinned level), fulfillment (a step of a fulfillment-channel lane, such as Amazon's MFN lane) or channel (a step of the channel sequence); null when no level prices the listing. is_fba is true for listings fulfilled by the channel's own network (FBA), which a fulfillment lane never prices. Filter on filter[priced_from_scope] and filter[is_fba] to isolate what a lane prices. Each row also carries guardrail_scope (channel, product or listing — which guardrail rule applies to it), guardrail_override_id and never_pushed.
master_of_price_override and pinned_pricing_tier_id are the listing's own stored price ownership — both null while the listing inherits the channel's master of price and price levels. master_of_price is the effective value after inheritance.
Which pricing sync profile governs each listing. Every row carries pricing_sync_profile_id and pricing_sync_profile_name — the EFFECTIVE profile after inheritance — and pricing_sync_profile_source: listing (the listing's own), product (inherited from the product), channel (the channel default) or inline (no profile at any level; the channel's inline settings apply). pricing_sync_profile_override_id is the listing's OWN profile, null while it inherits, and pricing_sync_profile_archived is true when the effective profile has been archived (it still governs the listing). Filter on filter[profile] by profile ID or by source, and sort on pricing_sync_profile_name.
Why a row is Not priced (call review U1): every row carries not_priced_reason — no_master, no_sequence, no_channel_price or no_price_at_levels — and null on every priced row. It is computed by the same SQL expression that backs filter[not_priced_reason] and the summary's not_priced_reasons counts, so the tile, the filter and the row can never disagree. A pinned tier, an MFN-lane sequence on an MFN listing, the effective profile's sequence or the inline sequence each count as "levels exist".
filter[master_override] selects by the listing's OWN master instead (any, sku.io, sales_channel, neither) — the pinned listings, independent of the instance setting.
status can also be ended_on_channel: the channel no longer hosts the listing (retired, expired or deleted — remote_status is missing). It is its own bucket and never one of the price buckets, whatever the two price columns hold, and such listings are never included in a price push. status_label reads "Ended on channel".
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.