• Money is in the store currency’s major units ("29.99"); status is draft | active | archived (new products start as draft).
  • Each product is saved on its own and reported in results as created, updated or failed with the reason — check every item, a 200 does not mean every product landed.
  • A product without options gets one variant at price. Giving inventory_quantity turns stock tracking on.
  • Re-sending a product with the same title updates it (variants matched by their option values) instead of creating a duplicate.
  • A storefront resync is scheduled automatically after the import.
Scope: catalog:write. For a single product use POST /products (dtc_upsert_product), which takes the same shape and answers with the full product and its variant ids.