Listing management, end to end
The full path from an empty catalog to a live, maintained listing — including the three constraints that most often surprise integrators.
Three things to design around before you start.
- Category values are not round-trippable: reads return the name, writes require the ID.
- Variants are fixed at creation. Only price and stock can change afterwards.
- There is no bulk update. Bulk is create-only; maintenance is one call per product.
- Resolve the category ID
Call
GET /open/v1/categoriesand keep a mapping from your own taxonomy to thecategory_idvalues it returns. Product create and update require that ID; sending a name returns400 CATEGORY_NOT_FOUND.The round-trip trap.
GET /products/{id}returns"category": "Accessories"— a display name.POSTandPUT /products/{id}require"category": "pcat_01J2X…"— the category_id. A naive read-modify-write loop therefore fails with400 CATEGORY_NOT_FOUND. Keep the ID from your own mapping; never echo back thecategoryvalue you read from a product. - Host your images
The API accepts image URLs, not uploads. Each must be
https://, at most 2,048 characters, and publicly reachable at creation time. Up to 20 per product. There is no upload endpoint — serve images from your own CDN before you create the listing. - Create the productPOST/open/v1/productscatalog:write · 201
{ "title": "Premium Leather Wallet", "description": "Full-grain leather, six card slots.", "category": "pcat_01J2X…", // category_id from GET /categories — NOT the name "images": [ "https://cdn.example.com/wallet-front.jpg", "https://cdn.example.com/wallet-back.jpg" ], "variants": [ { "title": "Black", "sku": "WALLET-BLK", "price": 259900, "stock": 45, "options": { "colour": "Black" } }, { "title": "Tan", "sku": "WALLET-TAN", "price": 259900, "stock": 30, "options": { "colour": "Tan" } } ] }At least one variant is required, each with a non-negative integer
pricein centavos andstock. Do not sendstatus— it is set separately in the next step. - Publish itPOST/open/v1/products/{id}/statuscatalog:write
Creation does not make a listing buyable. Send
{ "status": "live" }to publish. Statuses arelive,unlistedanddelisted. - Maintain it
To change Call Note Title, description, category, images PUT /products/{id} Images replace the whole set — send the complete list, not a delta Prices PUT /products/{id}/price Atomic across the variants you name Stock PUT /products/{id}/stock Absolute quantities, up to 100 variants per call Visibility POST /products/{id}/status Add or remove a variant Seller Center Recreate the listing, or edit it in Seller Center. Category attribute values Read-only API Read attribute definitions through the API; manage values in Seller Center. - Keep stock in sync
Use
PUT /open/v1/products/{id}/stockfor stock sync. It sets absolute per-variant quantities byvariant_idin one call. This is the recommended path for stock sync — one absolute set per variant. The/inventorywrite routes are also available (see Inventory) if you prefer per-item updates.PUT /open/v1/products/prod_abc123/stock { "items": [ { "variant_id": "var_blk", "stock_quantity": 42 }, { "variant_id": "var_tan", "stock_quantity": 0 } ] } - Onboard a large catalogPOST/open/v1/products/bulkcatalog:write · 201
Up to 5,000 products per request, 100 variants each. Batches over 50 run asynchronously and return a job — see Bulk operations & jobs. This endpoint creates only. It cannot update existing products; items carry no product ID and sending one is a validation error.