Get Publish-Readiness Snapshot
GET/api/v2/products/:product/publish-readiness
Per-product, multi-channel publish readiness snapshot. Returns one entry per publish-capable, connected sales channel, grouped by bucket (live / ready / ready_to_list / warn / idle / publishing / scheduled / draft) so the publish dialog can render confidence groups without orchestrating N parallel calls.
products:readGrant this scope to your token under Settings → Developer → Personal Access Tokens.
Read-only: does NOT speculatively create drafts. Channels with no draft and no live listing land in idle and surface recommended next actions (pick a template, create one, etc.).
Bucket resolution:
live— a non-archivedProductListingexists for this product on the channelready— open draft in statereadyscheduled— open draft in statescheduledpublishing— open draft in statepublishingorvalidatingwarn— open draft in stateerror, ORdraftwith validation errorsdraft— open draft in statedraftwith no validation errorsremoved— the listing was live and the channel no longer hosts itidle— no open draft and no live listing
Authentication: Requires Bearer token.
quantity_to_push (int|null, per channel entry) — the stock a publish to this channel would seed right now, computed through the same SalesChannelInventoryCalculator rules the standing inventory sync uses (max/min/buffer, locations, bundles). null when quantity seeding is gated off (listing-publishing push_quantity_on_publish setting disabled, SKU.io not master of stock for the instance, no inventory rules configured) or the bucket cannot publish (live / publishing).
quantity_variant_count (int|null, per channel entry) — how many variants the quantity_to_push figure is spread across. Non-null only for a matrix parent, whose own stock is always zero because every unit sits on a child: the figure is the sum across its variants, each of which is seeded with its own quantity when the family publishes. Null for a standalone product, whose figure is its own.
existing_listing (object|null, per channel entry) — the channel-side listing when one exists, else null. Fields:
remote_status— the last reconciled channel-side state:live,pending(accepted, still being ingested by the channel),rejected(the channel accepted the submission then refused to publish it, so it never went live),missing(was live, no longer hosted),archived(hosted but hidden from shoppers), orunknown.remote_status_checked_at— when that state was last confirmed with the channel.remote_status_reason(string|null) — the channel's own explanation when it refused the listing, shown verbatim so it names what to fix. For example, a Walmart item withheld for a missing primary image reports "This item is missing a primary image. Add a 'Main Image URL' and resubmit the item."nullwhen the channel gave no reason. Arejectedlisting stays rejected until the underlying problem is corrected and it is published again — resubmitting unchanged fails identically.
draft.channel_errors — what the SALES CHANNEL said when it refused the item, as distinct from validation_errors, which is what this system's own validation found before anything was sent. Each entry carries the channel's code, its message, and the field it names where one is given; channel_errors_count is the same list's length.
The two are different problems and want different handling: outstanding validation_errors mean the item is not ready to send, while channel_errors mean it was sent and came back rejected — republishing it unchanged will fail the same way.
Request
Responses
- 200
- 401
- 403
- 404
- 429
OK
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.