Product Listings
List Channel Inventory
Returns paginated channel inventory, aggregated to one row per listing across all of that listing's channel locations. Each row compares the quantity calculated by SKU.io (total_sku_quantity) against the quantity last reported by the sales channel (total_channel_quantity) and exposes the variance between them. Archived listings are excluded.
Export Channel Inventory
Streams a CSV file download of channel inventory records (one row per listing location, not aggregated per listing). Archived listings are excluded.
Get Channel Inventory Summary
Returns channel inventory counts grouped by integration, the list of connected channel accounts (integration instances) that have at least one active listing, and a breakdown of inventory records by sync status.
Export Listings
Streams a CSV file download of listings, ordered by most recently created first. With no scope (or scope=all) it exports every non-archived listing across every connected sales channel; scope=filtered applies the same filter[...] parameters as List Listings; scope=selected or current_page exports exactly the listings in ids.
Download Inventory Settings Import Template
Downloads an XLSX import template for bulk-editing listing inventory settings via spreadsheet import.
List Listing Inventory Caches
Returns the per-location channel inventory records for a single listing, ordered by channel location ID. Each record compares the quantity calculated by SKU.io (sku_quantity) against the quantity last reported by the sales channel (sales_channel_quantity) and includes the variance.
Preview Bulk Listing Inventory Settings Update
Dry run for Bulk Update Listing Inventory Settings. Computes exactly which listings would change and what each field's old and new values would be, without applying anything. Use it to validate a bulk update before committing it.
Bulk Update Listing Inventory Settings
Applies inventory settings to many listings at once. Runs synchronously — the response reports the number of listings updated.
Trigger Channel Inventory Recalculation
Flags channel inventory records for quantity recalculation. This is asynchronous: the request only marks the records; the quantities are recalculated by a scheduled background process on its next cycle, not immediately within this request.
Get Product Listing
Returns a single product listing with its sales channel, integration, pricing tier, inventory cache, and document relations loaded. The integration-specific resource class is used based on the sales channel.
Update Product Listing
Updates a product listing. If master_of_price or product_pricing_tier_id change, the price is pushed to the sales channel.
List Listing Metrics
Lists daily traffic and conversion per channel listing — one row per listing per day — as reported by the sales channel. Each row names the product (`product`) and the channel (`sales_channel`) it belongs to.
List Drafts
Paginated listing drafts for the drafts list. Slim payload — the heavy `fields[]` array is only served by show/update/validate.
Create Draft
Create a listing draft.
List Mappable Product Fields
Product columns you can use as a `product_field` mapping source in listing-draft field overrides and template field defaults. The list is served from the same definition the value resolver reads, so a picker can never offer a column that won't resolve.
Get Draft
Show a draft with the full per-field payload.
Update Draft (overrides, images, structure)
Update a draft — saves `field_overrides`, `image_urls`, and structural changes (`sales_channel_category_id`, `sales_channel_product_template_id`, `sales_channel_listing_profile_id`), then re-resolves and re-validates. The draft transitions to `ready` when no validation errors remain.
Validate Draft
Re-resolve the draft's values against current product data + mappings and re-run validation. Mapped overrides (`{source_type, source_value}`) are re-evaluated against the product on every call. State transitions to `ready` when validation passes, back to `draft` when errors appear. A draft without a category records a `missing_category` validation error.
Preview Draft Against Product
Resolve this draft's mappings (its template + field overrides) against a DIFFERENT product, returning the value each channel field would receive for that product — with no persistence. Useful for a 'preview against another product' control: mapped fields (`product_field` / `product_attribute` / `expression`) re-evaluate against the given product, while typed literal values stay as-is.
Get Draft Publish Attempts
Publish-attempt history for a listing draft: one entry per publish/update attempt, oldest first. A retried publish appends a new attempt rather than overwriting the last error, so you can see each transient retry (retryable = true) and the final terminal failure (retryable = false).
Export Draft Template Fields
Download the draft category's field requirements as a styled Excel (.xlsx) workbook. The workbook has one row per channel field with its priority (required / recommended / optional), type, allowed values, plain-language guidance, what SKU.io currently maps into it, and the resolved sample value — so the still-empty fields can be collected from a supplier. Required fields lead the sheet; fixed-option fields get a dropdown of the allowed values on the sample cell.
Get Draft Variation Matrix
The variation matrix for a draft: the variation theme (e.g. 'Color-Size'), its axes, and the per-child grid. Each child carries its axis values plus per-variant identity — `upc` (the variant's barcode, null when not set), `price` (null when the variant has no own price), `image_url` (the variant's primary image, null when it has none) — an `is_primary` flag marking the variant published as the group's primary, and a readiness verdict: `status` is `ready` or `incomplete`, with `issues` listing human-readable reasons (e.g. 'Missing Color', 'Needs UPC') that would block publishing the variation family. Empty axes/children for a single-variation product.
Validate Draft Variation Matrix
Validate a draft's variation matrix locally (before publishing): theme completeness, duplicate combinations, per-channel variation caps, and axis consistency. Returns whether the matrix is valid plus any errors keyed to a child/axis.
Create Drafts in Bulk
Create one `create`-purpose draft per product on a sales channel and return them, then pass the returned ids to Bulk Publish Drafts. Each draft is resolved and validated on creation.
Bulk Publish Drafts
Publish up to 500 drafts (for example the ones returned by Create Drafts in Bulk) as one background job. Returns the job id; each draft's `state`, `published_at` and `channel_errors` are updated as the job progresses — read the drafts, or their publish attempts, to follow it. Drafts that are not publishable are left unchanged.
Prepare Ready-to-List Drafts
Seed a draft for every 'ready to list' product on a sales channel — products that are data-complete and routed to a template by their product type, but do not yet have a draft or a live listing. Each product's own template (and its category and listing profile) is resolved and applied automatically, so no template needs to be chosen. Runs as one background job and returns its id; the seeded drafts move to `ready` (or `draft` if a field still needs attention) as the job progresses — read the drafts to follow it, then publish them with Bulk Publish Drafts.
Resolve Draft Categories
Resolve the channel category for up to 500 products on one sales channel in a single call, before creating drafts in bulk: the product's own override on the channel first, else the category its product type is mapped to — with provenance and the category's default template per product. Nothing is created. A product that resolves to nothing comes back with `sales_channel_category` and `provenance` null; pick a category for it (or map its type) before publishing.
List Channels for Products
List the sales channels the given products are currently listed on, with how many of the selected products are listed vs not listed on each channel, and whether the channel supports bulk archive / recover / delete.
Get Channel Action Eligibility
Return the per-state breakdown of the selected products on a single sales channel plus, for each action, how many products are eligible and whether the channel supports it.
Run Bulk Channel Action
Run a bulk channel action (archive, recover or delete) against the eligible listings of the selected products on a sales channel. The action runs in the background and the response returns a `tracked_job_log_id` you can poll for progress and a per-product success/failure summary.
Get Content Sync Settings
Get the ongoing content-sync configuration for a sales-channel integration instance: whether sync is enabled, the reconcile cadence, per field-group / per-field ownership and auto-apply defaults, and the governance gate.
Update Content Sync Settings
Update the instance-level content-sync configuration. Partial updates are merged onto the current settings, so only the keys you send change — but enabled is required on every request. Enabling sync for the first time starts a background baseline job over every mapped listing on the instance, so pre-existing differences are not flagged as drift on day one; poll the jobs API to watch it complete.
Get Channel Attribute Mappings
List the channel-native attributes this integration instance has actually synced, together with the SKU product fields they can be mapped onto, so channel content can be governed by content sync like any other field.
Update Channel Attribute Mappings
Replace the instance's channel attribute mappings. The payload is authoritative: any code not present in mappings is unmapped, so send the full set you want kept, not just the changes.
List Content Changes for Listing
Open (pending, conflict, or error) content changes detected on one listing, plus the listing's cached content-sync status. Each change carries the current catalog value and the channel value side by side so the difference can be reviewed field by field.
Get Content Change History
Full audit trail of content changes for a listing, newest first — including applied, auto-applied, ignored, superseded, rolled-back, and resolved-conflict entries. Every filter is optional; the unfiltered call returns the most recent entries (default 200, max 500).
Roll Back Content Change
Restore the catalog value that an applied change replaced. Nothing is deleted: the original entry is marked rolled_back and a new audit entry records the restore, so the history stays complete.
Apply Content Changes
Apply open channel changes to the catalog product. Scope by change_ids or by fields; omit both to apply every open change on the listing. Conflict rows are skipped unless conflict_resolution is provided (mine keeps the catalog value, theirs applies the channel value, both applies the channel value while preserving the catalog value for outbound re-push).
Ignore Content Changes
Dismiss open changes without touching the catalog. The suggestion stays dismissed until the channel value changes again — the same channel state is never re-flagged. Scope by change_ids or fields; omit both to ignore everything open on the listing.
Reconcile Listing Content
Re-compare this listing's channel content against the catalog right now and return the fresh set of open changes. Useful after editing the product on the channel when you don't want to wait for the scheduled reconcile.
Get Listing Content Rules
Get the content ownership rules in force for a single product listing, and where each one comes from.
Update Listing Content Rules
Customise the content ownership rules for a single product listing, overriding what its sales channel says.
List Content Drift
Paginated feed of detected content changes across every listing and channel — the review inbox for channel edits awaiting a decision. Defaults to open changes (pending, conflict, error); pass filter[status] to browse history.
Get Content Sync Summary
Open-change counts for badges and summary cards: totals by status (pending, conflict, error), the number of listings affected, and a breakdown by field group.
List Drift Groups
Pre-bucketed view of the same drift feed, so a templated update such as a weight change across 120 listings can be reviewed as one row instead of 120. Buckets honour every filter the feed accepts, so a bucket's counts always match what listing the same filters returns. has_risky marks buckets containing high-impact fields that must be reviewed one listing at a time.
Apply Content Change Group
Applies every open change in one bucket in the background, without listing ids. The bucket is described by the same filters used to list it, so a bucket of several thousand listings needs no enumeration by the caller. Send the filters in the QUERY STRING — filters in the request body are ignored, which would silently widen the apply. The apply must be scoped by at least one of filter[field], filter[field_group], or filter[integration_instance_ids]; an unscoped call returns 422. High-impact fields such as product name are rejected with 422 and must be applied one listing at a time. Very large buckets are applied in passes: listings_queued below listings_total means the call should be repeated to continue. Follow progress with the returned tracked_job_log_id.
Bulk Apply Content Changes
Apply pending changes across many listings as a background job. High-impact fields (for example product name) are excluded unless include_risky is true. Optionally narrow to specific fields.
Bulk Ignore Content Changes
Dismiss pending changes across many listings in one call. Runs inline (no background job) since only change statuses are updated — the catalog is untouched.
Reconcile Content Drift
Start an on-demand reconcile as a background job: re-pull channel content and re-compare against the catalog for every enabled instance, or a scoped set of instances or listings. This is the same sweep that runs on the configured schedule — it catches channels without update webhooks and any missed webhook deliveries.
List Content Conflicts
Paginated conflicts: fields owned two-way where both the catalog and the channel changed since the last known synced state. Each row carries both values so a side can be chosen. Supports the same filters, sorts, and pagination as List Content Drift.
Resolve Content Conflict
Resolve one two-way conflict.
List Channel Catalogs
Paginated list of channel catalogs, each with its rule count and the sales channels using it.
Create Channel Catalog
Create a catalog, optionally with its rules and channel assignments in the same call.
Get Channel Catalog
One catalog with its full rule set. Each rule's reference is resolved to a human label (`ref_label`, and `ref_sku` for product rules) so it can be rendered without extra lookups.
Update Channel Catalog
Update a catalog. Sending `rules` REPLACES the entire rule set rather than appending; omitting the key leaves the existing rules untouched. The same applies to `sales_channel_ids`.
Delete Channel Catalog
Delete a catalog. Every channel using it is released back to carrying the whole product range — a channel is never left pointing at a catalog that no longer exists, and no listings are removed.
List Eligible Products
The products this catalog currently admits, resolved from its rules. Filter rules are re-evaluated on every call, so this reflects products created since the catalog was saved.
Get Catalog Impact
What this catalog costs each channel it governs.
List Channel Field Names
Every distinct field name across the channel's synced categories, with how many categories carry it and in how many it is required. This is the vocabulary a global attribute mapping targets: a mapping is keyed on a NAME and matched case-insensitively against each category's fields when a listing's values are resolved, so a name that recurs across hundreds of categories is worth mapping once, while a one-off belongs on that category's template.
Generate Listing Content
Generate listing content for one product on one sales channel using the tenant's configured AI provider. The prompt carries the product's facts (name, identifiers, brand, weight, dimensions, category, and its attributes) plus any `source_material` you pass, and applies the TARGET channel's own description rules — TikTok Shop: HTML, up to 10,000 characters, 3–5 selling points; Amazon: plain text, up to 2,000; eBay and Shopify: HTML; Walmart, Temu and Faire: plain text — so you do not restate them.
Bulk Generate & Apply Listing Content
Queue a bulk AI content enrichment for many products on one sales channel. For each product the configured AI provider generates listing content, which is written to the product attributes that channel's templates read from — so the products become ready to list without generating each one individually. Returns 202 with a tracked job id; the job records a per-product summary (enriched / skipped / failed) as it runs.
Get Channel Category Map
The channel's product type → category map: one row per active leaf product type, path-ordered. Each row carries the type, how many active products carry it, the channel category it maps to (or null), `category_missing` (true when a taxonomy re-sync removed the mapped category — the row counts as unmapped until it is re-mapped), the mapped category's default template and how many templates that category has.
Replace Channel Category Map
Replace the channel's map in full. Every row in the payload with a category is saved; a row with a null category — or a leaf type absent from the payload — loses its mapping. Every category must belong to this channel and be a leaf (products cannot list into a parent category); violations answer 422 keyed on `rows.N.sales_channel_category_id`.
Seed Channel Category Map
Propose a category for each unmapped leaf product type (or for every leaf type when `only_unmapped` is `false`) from the channel's synced taxonomy: the best match for the type's name plus a sample of its products' names. Nothing is saved — review the proposals and send the accepted ones with Replace Channel Category Map. Types with no confident match are left out.
Get Inventory for Product Listing
Returns the available inventory for a product listing across all warehouses / sales channel inventory locations.
Link to Subscription Offering
Links a product listing to a subscription offering. Used for subscription-based sales channels.
Unlink from Subscription Offering
Unlinks a product listing from a subscription offering.
Refresh Amazon Buy Box
Samples Amazon's Featured Offer (Buy Box) for the ASINs behind the selected listings and stores the result against each ASIN.
Show Product Listing
Returns a single product listing with its sales channel, integration, pricing tier, inventory cache, and document relations loaded. The integration-specific resource class is used based on the sales channel.
Update Product Listing
Updates a product listing. If master_of_price or product_pricing_tier_id change, the price is pushed to the sales channel. If inventoryLocations is provided, inventory is synced to the channel.
Get Publish-Readiness Snapshot
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.
Get Publish Matrix
Catalog-wide publish matrix. Returns a paginated list of products with per-channel publish state (bucket) for each publish-capable connected channel. Returns catalog-wide publish state per product across channels.
Get Listing Health Rollup
Per-channel listing-health rollup: how many listings on each sales channel are live, archived, removed (no longer on the channel), drifted (channel quantity/price differs from SKU.io), or stale (not verified against the channel in the last 24 hours). Also returns catalog-wide totals. Counts are driven by the last reconciliation of each listing.
Reconcile Listing Status
Start a reconciliation that fetches the true state of each listing directly from its sales channel and updates the stored status, quantity and price. With no body it reconciles every channel that supports status reporting; pass sales_channel_ids to limit it to specific channels, or product_listing_ids to recheck a specific set of listings. Runs asynchronously and returns the id of the background job doing the work.
Recover Listing on Channel
Recover an archived or removed listing back to live on its sales channel — the inverse of ending a listing. Depending on the channel this re-publishes, un-hides, restores from trash or restores stock for the same listing. Only applies to listings whose remote_status is archived or missing. On success the listing's remote_status returns to live.
Push to Fix Listing Drift
Fix a drifted listing: re-push SKU.io's stock to the channel (flags the listing for the next outbound inventory sync) and recheck its channel-side state so the drift flag refreshes. Runs asynchronously; returns the background job id.
Recalculate Listing Price
Re-resolve one product listing's cached SKU.io price from its product's pricing levels and profiles, and return the new figure — the pricing counterpart of the listing's inventory recalculation.
Validate Requirements
Dry-run a set of products against a template on a sales-channel instance and report, per product, required and recommended field coverage (present vs missing) plus any validation issues. Nothing is created or published.
Preview Bulk Listing Pricing
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.
Bulk Update Listing Pricing
Applies a pricing change to many listings at once: pin each listing to a Master of Price and, when SKU.io owns the price, a pricing level — or reset them to inherit from their channel. Takes the same body as Preview Bulk Listing Pricing; run the preview first for a dry run of the same payload.
Delete Listing from Channel
Delete a listing from its sales channel and remove the local listing record in one operation. When the listing reached the channel (its remote_status is live, archived or missing) and the channel supports deletion, the channel-side delete runs first; if the channel rejects it, the local record is preserved and a 422 is returned so you can retry. A listing that never went live (rejected or pending) is simply removed locally.
Get Product Listing Handling Time
The listing's handling time (Walmart lag time) as the channel promises it: effective, desired and confirmed days, mode, the per-warehouse reason, push status and the last push. data is null when the listing has no handling-time record (feature off, or a channel without handling-time push).