omni products bulk-update, JavaScript products.bulkUpdate, or Python
products.bulk_update to update existing catalog SKUs from uploaded CSV or Excel
files. These methods use the same price validation, inventory authority, SKU
matching, and durable processing as Omni’s Products → Bulk Update page.
Available in TypeScript SDK 0.23.0, Python SDK 0.18.0, and CLI 0.14.1.
The API and built-in agent instructions require the corresponding application release.
Prepare the file and stock source
Upload the file through Documents and keep its document ID. Each request accepts 1–10documentIds, with up to 10,000 data rows per file. Files are applied in
requested order. Repeated document IDs are deduplicated.
For inventory updates, select a sourceId or locationId from the eligible
sources returned by products.bulkUpdateOptions / products.bulk_update_options.
This list matches Omni Bulk Update and excludes stock sources that cannot accept
manual or CSV quantities. Preserve the seller’s selected source; ask for a choice
when multiple sources remain.
scope: "price", "inventory", or "both" (the default). Inventory and both
require a source or location. Pass exact column names when known; otherwise the
shared import workflow detects columns and reports unresolved mappings.
Submit one durable update
catalog:write and the corresponding product/inventory permissions.
Reads require catalog:read. Credentials fix the organization; do not send an
organization ID with an organization API key.
syncToMarketplaces defaults to true. Set it to false for catalog/source-only
work. Omit marketplaces to use every eligible existing listing, or pass the
seller’s requested marketplace subset. All supported marketplaces use the shared
adapters. This operation does not create catalog products or new listings.
Zero prices and quantities are valid catalog values. Unknown SKUs and SKUs
matching multiple catalog records are reported explicitly; duplicate SKUs within
a file are rejected. Prices retain the existing catalog currency unless a
currency column is provided. Stock uses the selected source’s authority and
availability rules.
Check every saved import
Price and inventory have separate saved import references. Keep all references, including when one side fails. Submission returns immediately after validation and queueing; durable execution continues after the client disconnects.success is true only when every requested import completed without rejected or
unknown rows. pendingCount, failedCount, allTerminal, and ordered per-import
results preserve partial outcomes. Request includeRows: true, rowOffset, and
rowLimit (maximum 100) for bounded row evidence. Python arguments are
include_rows, row_offset, and row_limit; nested JSON and response keys stay
camelCase.
Inventory applied confirms source balances were saved and any required sync was
queued. It does not certify marketplace completion. The shared workflow syncs
changed values; use selected-field publishing
to explicitly republish unchanged values, and commerce verification
for requested channel evidence.
If dispatch fails, the result retains saved import references and a per-document
error. Inspect those references before retrying; pending or accepted work is not
proof of completion. Avoid a long client loop or one request per SKU.
REST endpoints
The API reference is generated from the canonical runtime schemas.
For reviewed product-ID price/cost plans, see catalog operations.