Edit an item (allow-listed fields only)
- Credentials, one of
- Station token
- OAuth access token
- Scopes
listings:write- Subscription
- Needs an active plan. Otherwise
403 subscription_locked. - Idempotency
- Send an
Idempotency-Keyheader. A retry with the same key does the work once.
Access: OAuth scope listings:write; write-gated by the subscription.
AuthorizationBearer <token>It may call only the operations whose x-stations lists its kind, on its own store, and acts through the access of the owner or admin who paired it. Unpairing it, or that person leaving the business, ends it (401 station_revoked).
storeId*stringA store the person can reach. Any other id answers 404, never 403.
productId*stringAn item id (any kind, not only physical products).
Idempotency-Key*stringRequired on every write. Minted on the device when the person taps, reused on every retry. A write without one, or with one that does not match the pattern, is refused with 422 validation_error. Scoped to the token's subject, remembered 24 hours. A replay returns the first 2xx response with Idempotent-Replay: true; a request still running answers 409 in_flight; the same key with a different method, path or body answers 409 idempotency_key_reused; non-2xx results are not remembered. If the key store cannot be read nothing is processed and the answer is 503 idempotency_unavailable: retry with the same key.
^[A-Za-z0-9_-]{8,128}$application/json- body
parseItemPatch(). At least one field. compareAtPrice: null removes the was-price.
title?string1 <= length <= 140description?stringlength <= 8000price?A price as the server parses it: amount is a whole, non-negative number of minor units (a numeric string is coerced). currency defaults to ZAR.
compareAtPrice?|nullcostPrice?A price as the server parses it: amount is a whole, non-negative number of minor units (a numeric string is coerced). currency defaults to ZAR.
status?ItemStatus"draft""active""archived"tags?array<string>items <= 24productType?stringlength <= 80categoryIds?array<string>|The categories to file it under, replacing its present ones (ids from listCategories; an id that is not one of the store's live categories is refused with 422). null or [] takes it out of every category. Left out, they stay.
items <= 20media?array<>seo?details?Same field names as the matching *Details read schema; sold on tiers is ignored and kept from the stored item.
OK
application/json- response
data*details is shaped by kind.
curl -X PATCH 'https://api.shopeazy.co/v1/merchant/stores/<storeId>/products/<productId>' \ -H 'Authorization: Bearer <access_token>' \ -H 'Idempotency-Key: <unique_key>' \ -H 'Content-Type: application/json' \ -d '{ "price": { "amount": 32900, "currency": "ZAR" }, "tags": [ "indoor", "low light", "bestseller" ], "seo": { "title": "Monstera deliciosa, 20 cm pot", "description": "A healthy, glossy monstera delivered in Johannesburg." }}'{ "data": { "id": "65myAK8IFZKwZBG84Gmw", "kitId": "cbzXdyoC08TecFtCKeTn", "kind": "physical", "title": "Monstera deliciosa, 20 cm pot", "slug": "monstera-deliciosa-20-cm-pot", "description": "A healthy, glossy monstera in a 20 cm nursery pot. Bright, indirect light and a drink every week or so.", "price": { "amount": 32900, "currency": "ZAR" }, "compareAtPrice": { "amount": 39900, "currency": "ZAR" }, "status": "active", "tags": [ "indoor", "low light", "bestseller" ], "categoryIds": [ "s9EOwLS0KUlAWoAEdqRT" ], "media": [ { "id": "m0-mvnovvgd", "url": "https://images.example.com/plants/monstera.jpg", "alt": "A monstera in a terracotta pot" } ], "details": { "sku": "MON-20", "barcode": "6001000000017", "trackInventory": true, "stock": 24, "lowStockThreshold": 5, "requiresShipping": true, "options": [], "variants": [] }, "customisations": [], "managedInConsole": [ "SEO" ], "updatedAt": 1792924382485 }}