Products
Requires scope merchant-items-read.
Lists the store’s products — the same object products/* webhooks send, with variants, images, the canonical URL and the storefront price. Same filtering as the dashboard table with cursor pagination (limit + starting_after, has_more/next_cursor); sorts limited to public fields. Optional updated_after walks product rows changed after a timestamp, oldest change first; start each poll five minutes before the previous poll start, deduplicate ids, keep filters fixed and walk sequentially. With updated_after, sort_by, sort_order, page and per_page return 422; a cursor is bound to the same timestamp and filters. Variant, image, metafield, stock, region, price, discount, bulk publish, unpublish, archive status or inventory-tracking changes and deleted products may be missed; long-running changes may appear late. The filter time is not returned and may differ from updated_at; this is not a snapshot or deletion feed.
Authorization
merchantKey The store's private API key (sk_live_…, sk_test_… on a dev store) from Dashboard → Settings → API keys. It is bound to one store and carries the scopes the merchant granted; each operation names the scope it needs. Server-side only — never ship it to a browser or an app bundle.
In: header
Query Parameters
1 <= value <= 100Value in
- "created_at"
- "updated_at"
- "title"
- "price"
- "stock"
- "published"
- null
uuiduuiduuiduuiduuidValue in
- "0"
- "1"
- "true"
- "false"
- null
Value in
- "0"
- "1"
- "true"
- "false"
- null
Header Parameters
A private API key (sk_live_…, sk_test_… on a dev store) minted under Dashboard → Settings → API keys. The key is bound to ONE store, so no vendor header or vendor_id is sent; its scopes decide which operations it may call. pk_ public keys never reach this API. Keep it on your server.
Your own correlation id (8–128 chars, ^[A-Za-z0-9_.:-]+$). Echoed back on the response and on every log line of the request; one is generated when you omit it.
Response Body
application/json
application/json
application/json
application/json
application/json
curl -X GET "https://example.com/products?limit=2&stock_status=in_stock&updated_after=2026-10-03T11%3A55%3A00Z" \ -H "X-Client-Key: {{merchantKey}}"{ "data": [ { "id": 20418, "uid": "019a1d52-3c8e-7f41-b0d2-6a3e9c1f4b22", "title": "Homemade Chapman", "slug": "homemade-chapman", "excerpt": "Fresh Chapman with cucumber and orange slices.", "description": "Our house Chapman, mixed fresh every morning. Served chilled.", "status": "active", "published": true, "in_stock": true, "price": "2500.00", "storefront_price": "2500.00", "storefront_compare_at_price": null, "url": "https://adeyemifoods.com/products/homemade-chapman", "currency": "NGN", "sku": "ADF-CHP-000", "barcode": null, "stock": 60, "track_inventory": true, "is_digital": false, "has_variants": true, "image": "https://media.usequeek.com/uploads/stores/1095/homemade-chapman.jpg", "thumbnail_image": null, "primary_image_url": "https://media.usequeek.com/uploads/stores/1095/homemade-chapman.jpg", "variants": [ { "id": 7731, "uid": "019a1d52-5f10-7a02-8c61-0b2d4e6f8a31", "sku": "ADF-CHP-50CL", "title": "50cl", "option_values": { "Size": "50cl" }, "price": "2500.00", "storefront_price": "2500.00", "storefront_compare_at_price": null, "url": "https://adeyemifoods.com/products/homemade-chapman", "compare_at_price": null, "stock": 36, "track_inventory": true, "is_digital": false, "is_active": true, "is_backorder": false, "backorder_ready_date": null, "weight": 0.55, "position": 0, "created_at": "2026-07-15T11:30:00+01:00", "updated_at": "2026-09-22T16:05:00+01:00" }, { "id": 7732, "uid": "019a1d52-5f10-7a02-8c61-0b2d4e6f8a32", "sku": "ADF-CHP-1L", "title": "1 litre", "option_values": { "Size": "1 litre" }, "price": "4200.00", "storefront_price": "4200.00", "storefront_compare_at_price": null, "url": "https://adeyemifoods.com/products/homemade-chapman", "compare_at_price": null, "stock": 24, "track_inventory": true, "is_digital": false, "is_active": true, "is_backorder": false, "backorder_ready_date": null, "weight": 1.05, "position": 1, "created_at": "2026-07-15T11:30:00+01:00", "updated_at": "2026-09-22T16:05:00+01:00" } ], "images": [ { "id": 88220, "is_primary": true, "position": 0, "url": "https://media.usequeek.com/uploads/stores/1095/homemade-chapman.jpg", "alt": "Two bottles of chilled Chapman with cucumber slices", "width": 1200, "height": 1200, "variants": { "thumb": { "url": "https://media.usequeek.com/uploads/stores/1095/homemade-chapman-thumb.webp", "w": null, "h": null }, "card": { "url": "https://media.usequeek.com/uploads/stores/1095/homemade-chapman-card.webp", "w": 480, "h": 480 }, "card2x": { "url": "https://media.usequeek.com/uploads/stores/1095/homemade-chapman-card2x.webp", "w": 800, "h": 800 }, "view": { "url": "https://media.usequeek.com/uploads/stores/1095/homemade-chapman-view.webp", "w": 1200, "h": 1200 }, "wa": { "url": "https://media.usequeek.com/uploads/stores/1095/homemade-chapman-wa.jpg", "w": 1080, "h": 1080 }, "original": { "url": "https://media.usequeek.com/uploads/stores/1095/homemade-chapman.jpg", "w": 1200, "h": 1200 } } } ], "metafields": {}, "metadata": {}, "created_at": "2026-07-15T11:30:00+01:00", "updated_at": "2026-09-22T16:05:00+01:00", "deleted_at": null }, { "id": 20417, "uid": "019a1d52-3c8e-7f41-b0d2-6a3e9c1f4b21", "title": "Jollof Rice Party Pack", "slug": "jollof-rice-party-pack", "excerpt": "Smoky party jollof for 10, with fried plantain and grilled chicken.", "description": "Firewood-smoked party jollof cooked to order, served with dodo and six pieces of grilled chicken. Feeds 10.", "status": "active", "published": true, "in_stock": true, "price": "18500.00", "storefront_price": "16650.00", "storefront_compare_at_price": "18500.00", "url": "https://adeyemifoods.com/products/jollof-rice-party-pack", "currency": "NGN", "sku": "ADF-JRP-001", "barcode": "6154000102417", "stock": 42, "track_inventory": true, "is_digital": false, "has_variants": false, "image": "https://media.usequeek.com/uploads/stores/1095/jollof-rice-party-pack.jpg", "thumbnail_image": null, "primary_image_url": "https://media.usequeek.com/uploads/stores/1095/jollof-rice-party-pack.jpg", "variants": [], "images": [ { "id": 88214, "is_primary": true, "position": 0, "url": "https://media.usequeek.com/uploads/stores/1095/jollof-rice-party-pack.jpg", "alt": "Jollof rice party pack in a foil tray", "width": 1200, "height": 1200, "variants": { "thumb": { "url": "https://media.usequeek.com/uploads/stores/1095/jollof-rice-party-pack-thumb.webp", "w": null, "h": null }, "card": { "url": "https://media.usequeek.com/uploads/stores/1095/jollof-rice-party-pack-card.webp", "w": 480, "h": 480 }, "card2x": { "url": "https://media.usequeek.com/uploads/stores/1095/jollof-rice-party-pack-card2x.webp", "w": 800, "h": 800 }, "view": { "url": "https://media.usequeek.com/uploads/stores/1095/jollof-rice-party-pack-view.webp", "w": 1200, "h": 1200 }, "wa": { "url": "https://media.usequeek.com/uploads/stores/1095/jollof-rice-party-pack-wa.jpg", "w": 1080, "h": 1080 }, "original": { "url": "https://media.usequeek.com/uploads/stores/1095/jollof-rice-party-pack.jpg", "w": 1200, "h": 1200 } } } ], "metafields": {}, "metadata": { "erp_id": "ERP-20417" }, "created_at": "2026-07-14T10:20:00+01:00", "updated_at": "2026-09-22T16:05:00+01:00", "deleted_at": null } ], "has_more": true, "next_cursor": "eyJpZCI6MjA0MTcsIl9wb2ludHNUb05leHRJdGVtcyI6dHJ1ZX0"}Requires scope merchant-items-create.
Creates a product with variants, images, categories and metafields; answers the created product — the same object GET products/{product} and products/* webhooks send.
Authorization
merchantKey The store's private API key (sk_live_…, sk_test_… on a dev store) from Dashboard → Settings → API keys. It is bound to one store and carries the scopes the merchant granted; each operation names the scope it needs. Server-side only — never ship it to a browser or an app bundle.
In: header
Header Parameters
A private API key (sk_live_…, sk_test_… on a dev store) minted under Dashboard → Settings → API keys. The key is bound to ONE store, so no vendor header or vendor_id is sent; its scopes decide which operations it may call. pk_ public keys never reach this API. Keep it on your server.
Your own correlation id (8–128 chars, ^[A-Za-z0-9_.:-]+$). Echoed back on the response and on every log line of the request; one is generated when you omit it.
Retry-safe write key. The same key with the same body replays the stored response for 24h with Idempotent-Replayed: true; with a different body it is 409 idempotency_key_reuse; while the first call is still running it is 409 idempotency_key_in_progress.
Request Body
multipart/form-data
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
application/json
application/json
application/json
application/json
application/json
application/json
curl -X POST "https://example.com/products" \ -H "X-Client-Key: {{merchantKey}}" \ -F title="Jollof Rice Party Pack" \ -F price="18500.00" \ -F excerpt="Smoky party jollof for 10, with fried plantain and grilled chicken." \ -F description="Firewood-smoked party jollof cooked to order, served with dodo and six pieces of grilled chicken. Feeds 10." \ -F barcode="6154000102417" \ -F stock="42" \ -F track_inventory="true" \ -F metadata="{ \"erp_id\": \"ERP-20417\" }" \ -F image_url="https://adeyemifoods.com/images/jollof-rice-party-pack.jpg"{ "status": "success", "message": "product updated", "data": { "id": 20417, "uid": "019a1d52-3c8e-7f41-b0d2-6a3e9c1f4b21", "title": "Jollof Rice Party Pack", "slug": "jollof-rice-party-pack", "excerpt": "Smoky party jollof for 10, with fried plantain and grilled chicken.", "description": "Firewood-smoked party jollof cooked to order, served with dodo and six pieces of grilled chicken. Feeds 10.", "status": "active", "published": true, "in_stock": true, "price": "18500.00", "storefront_price": "16650.00", "storefront_compare_at_price": "18500.00", "url": "https://adeyemifoods.com/products/jollof-rice-party-pack", "currency": "NGN", "sku": "ADF-JRP-001", "barcode": "6154000102417", "stock": 42, "track_inventory": true, "is_digital": false, "has_variants": false, "image": "https://media.usequeek.com/uploads/stores/1095/jollof-rice-party-pack.jpg", "thumbnail_image": null, "primary_image_url": "https://media.usequeek.com/uploads/stores/1095/jollof-rice-party-pack.jpg", "variants": [], "images": [ { "id": 88214, "is_primary": true, "position": 0, "url": "https://media.usequeek.com/uploads/stores/1095/jollof-rice-party-pack.jpg", "alt": "Jollof rice party pack in a foil tray", "width": 1200, "height": 1200, "variants": { "thumb": { "url": "https://media.usequeek.com/uploads/stores/1095/jollof-rice-party-pack-thumb.webp", "w": null, "h": null }, "card": { "url": "https://media.usequeek.com/uploads/stores/1095/jollof-rice-party-pack-card.webp", "w": 480, "h": 480 }, "card2x": { "url": "https://media.usequeek.com/uploads/stores/1095/jollof-rice-party-pack-card2x.webp", "w": 800, "h": 800 }, "view": { "url": "https://media.usequeek.com/uploads/stores/1095/jollof-rice-party-pack-view.webp", "w": 1200, "h": 1200 }, "wa": { "url": "https://media.usequeek.com/uploads/stores/1095/jollof-rice-party-pack-wa.jpg", "w": 1080, "h": 1080 }, "original": { "url": "https://media.usequeek.com/uploads/stores/1095/jollof-rice-party-pack.jpg", "w": 1200, "h": 1200 } } } ], "metafields": {}, "metadata": { "erp_id": "ERP-20417" }, "created_at": "2026-07-14T10:20:00+01:00", "updated_at": "2026-07-14T10:20:00+01:00", "deleted_at": null }}Requires scope merchant-items-read.
Searches this store’s shopper-visible products by keyword, availability or metafields. Results use storefront prices and cursor pagination. Keyword matching is case-sensitive; percent and underscore are wildcards.
Authorization
merchantKey The store's private API key (sk_live_…, sk_test_… on a dev store) from Dashboard → Settings → API keys. It is bound to one store and carries the scopes the merchant granted; each operation names the scope it needs. Server-side only — never ship it to a browser or an app bundle.
In: header
Query Parameters
2 <= length <= 100Value in
- "0"
- "1"
- "true"
- "false"
- null
The handle itself contains a dot, so Laravel's metafield.*
wildcard treats it as a nested path and does not reliably validate
the literal map key. Validate each handle/value at the map level.
items <= 5Value in
- "latest"
- "popular"
- "price_low"
- "price_high"
- null
1 <= value <= 100StorefrontCursor's signed envelope is not Laravel's raw Cursor.
Header Parameters
A private API key (sk_live_…, sk_test_… on a dev store) minted under Dashboard → Settings → API keys. The key is bound to ONE store, so no vendor header or vendor_id is sent; its scopes decide which operations it may call. pk_ public keys never reach this API. Keep it on your server.
Your own correlation id (8–128 chars, ^[A-Za-z0-9_.:-]+$). Echoed back on the response and on every log line of the request; one is generated when you omit it.
Response Body
application/json
application/json
application/json
application/json
application/json
curl -X GET "https://example.com/storefront/search?keyword=jollof&in_stock=1&sort=latest&limit=2" \ -H "X-Client-Key: {{merchantKey}}"{ "data": [ { "id": 20418, "uid": "019a1d52-3c8e-7f41-b0d2-6a3e9c1f4b22", "title": "Homemade Chapman", "slug": "homemade-chapman", "excerpt": "Fresh Chapman with cucumber and orange slices.", "description": "Our house Chapman, mixed fresh every morning. Served chilled.", "status": "active", "published": true, "in_stock": true, "price": "2500.00", "storefront_price": "2500.00", "storefront_compare_at_price": null, "url": "https://adeyemifoods.com/products/homemade-chapman", "currency": "NGN", "sku": "ADF-CHP-000", "barcode": null, "stock": 60, "track_inventory": true, "is_digital": false, "has_variants": true, "image": "https://media.usequeek.com/uploads/stores/1095/homemade-chapman.jpg", "thumbnail_image": null, "primary_image_url": "https://media.usequeek.com/uploads/stores/1095/homemade-chapman.jpg", "variants": [ { "id": 7731, "uid": "019a1d52-5f10-7a02-8c61-0b2d4e6f8a31", "sku": "ADF-CHP-50CL", "title": "50cl", "option_values": { "Size": "50cl" }, "price": "2500.00", "storefront_price": "2500.00", "storefront_compare_at_price": null, "url": "https://adeyemifoods.com/products/homemade-chapman", "compare_at_price": null, "stock": 36, "track_inventory": true, "is_digital": false, "is_active": true, "is_backorder": false, "backorder_ready_date": null, "weight": 0.55, "position": 0, "created_at": "2026-07-15T11:30:00+01:00", "updated_at": "2026-09-22T16:05:00+01:00" }, { "id": 7732, "uid": "019a1d52-5f10-7a02-8c61-0b2d4e6f8a32", "sku": "ADF-CHP-1L", "title": "1 litre", "option_values": { "Size": "1 litre" }, "price": "4200.00", "storefront_price": "4200.00", "storefront_compare_at_price": null, "url": "https://adeyemifoods.com/products/homemade-chapman", "compare_at_price": null, "stock": 24, "track_inventory": true, "is_digital": false, "is_active": true, "is_backorder": false, "backorder_ready_date": null, "weight": 1.05, "position": 1, "created_at": "2026-07-15T11:30:00+01:00", "updated_at": "2026-09-22T16:05:00+01:00" } ], "images": [ { "id": 88220, "is_primary": true, "position": 0, "url": "https://media.usequeek.com/uploads/stores/1095/homemade-chapman.jpg", "alt": "Two bottles of chilled Chapman with cucumber slices", "width": 1200, "height": 1200, "variants": { "thumb": { "url": "https://media.usequeek.com/uploads/stores/1095/homemade-chapman-thumb.webp", "w": null, "h": null }, "card": { "url": "https://media.usequeek.com/uploads/stores/1095/homemade-chapman-card.webp", "w": 480, "h": 480 }, "card2x": { "url": "https://media.usequeek.com/uploads/stores/1095/homemade-chapman-card2x.webp", "w": 800, "h": 800 }, "view": { "url": "https://media.usequeek.com/uploads/stores/1095/homemade-chapman-view.webp", "w": 1200, "h": 1200 }, "wa": { "url": "https://media.usequeek.com/uploads/stores/1095/homemade-chapman-wa.jpg", "w": 1080, "h": 1080 }, "original": { "url": "https://media.usequeek.com/uploads/stores/1095/homemade-chapman.jpg", "w": 1200, "h": 1200 } } } ], "metafields": {}, "metadata": {}, "created_at": "2026-07-15T11:30:00+01:00", "updated_at": "2026-09-22T16:05:00+01:00", "deleted_at": null }, { "id": 20417, "uid": "019a1d52-3c8e-7f41-b0d2-6a3e9c1f4b21", "title": "Jollof Rice Party Pack", "slug": "jollof-rice-party-pack", "excerpt": "Smoky party jollof for 10, with fried plantain and grilled chicken.", "description": "Firewood-smoked party jollof cooked to order, served with dodo and six pieces of grilled chicken. Feeds 10.", "status": "active", "published": true, "in_stock": true, "price": "18500.00", "storefront_price": "16650.00", "storefront_compare_at_price": "18500.00", "url": "https://adeyemifoods.com/products/jollof-rice-party-pack", "currency": "NGN", "sku": "ADF-JRP-001", "barcode": "6154000102417", "stock": 42, "track_inventory": true, "is_digital": false, "has_variants": false, "image": "https://media.usequeek.com/uploads/stores/1095/jollof-rice-party-pack.jpg", "thumbnail_image": null, "primary_image_url": "https://media.usequeek.com/uploads/stores/1095/jollof-rice-party-pack.jpg", "variants": [], "images": [ { "id": 88214, "is_primary": true, "position": 0, "url": "https://media.usequeek.com/uploads/stores/1095/jollof-rice-party-pack.jpg", "alt": "Jollof rice party pack in a foil tray", "width": 1200, "height": 1200, "variants": { "thumb": { "url": "https://media.usequeek.com/uploads/stores/1095/jollof-rice-party-pack-thumb.webp", "w": null, "h": null }, "card": { "url": "https://media.usequeek.com/uploads/stores/1095/jollof-rice-party-pack-card.webp", "w": 480, "h": 480 }, "card2x": { "url": "https://media.usequeek.com/uploads/stores/1095/jollof-rice-party-pack-card2x.webp", "w": 800, "h": 800 }, "view": { "url": "https://media.usequeek.com/uploads/stores/1095/jollof-rice-party-pack-view.webp", "w": 1200, "h": 1200 }, "wa": { "url": "https://media.usequeek.com/uploads/stores/1095/jollof-rice-party-pack-wa.jpg", "w": 1080, "h": 1080 }, "original": { "url": "https://media.usequeek.com/uploads/stores/1095/jollof-rice-party-pack.jpg", "w": 1200, "h": 1200 } } } ], "metafields": {}, "metadata": { "erp_id": "ERP-20417" }, "created_at": "2026-07-14T10:20:00+01:00", "updated_at": "2026-09-22T16:05:00+01:00", "deleted_at": null } ], "has_more": true, "next_cursor": "WzEsIjQ4NWY2NTk0YzYxODA3NmVmMDYxZWIwZjc2MGZlNGFiOWY0MGE0NzE3MGYzZTU2N2I4NDUzZTYwNzQwNGNiODIiLCJleUp3Y205a2RXTjBjeTVqY21WaGRHVmtYMkYwSWpvaU1qQXlOaTB3TnkweE5DQXhNRG95TURvd01DSXNJbkJ5YjJSMVkzUnpMbWxrSWpvaU1ERTVZVEZrTlRJdE0yTTRaUzAzWmpReExXSXdaREl0Tm1FelpUbGpNV1kwWWpJeElpd2lYM0J2YVc1MGMxUnZUbVY0ZEVsMFpXMXpJanAwY25WbGZRIl0"}Requires scope merchant-items-detail.
Retrieves one product — the same object products/* webhooks send, with variants, images, the canonical URL and the storefront price. {product} is a p_id, UUID or slug of this store.
Authorization
merchantKey The store's private API key (sk_live_…, sk_test_… on a dev store) from Dashboard → Settings → API keys. It is bound to one store and carries the scopes the merchant granted; each operation names the scope it needs. Server-side only — never ship it to a browser or an app bundle.
In: header
Path Parameters
Header Parameters
A private API key (sk_live_…, sk_test_… on a dev store) minted under Dashboard → Settings → API keys. The key is bound to ONE store, so no vendor header or vendor_id is sent; its scopes decide which operations it may call. pk_ public keys never reach this API. Keep it on your server.
Your own correlation id (8–128 chars, ^[A-Za-z0-9_.:-]+$). Echoed back on the response and on every log line of the request; one is generated when you omit it.
Response Body
application/json
application/json
application/json
application/json
application/json
curl -X GET "https://example.com/products/20417" \ -H "X-Client-Key: {{merchantKey}}"{ "status": "success", "message": "product", "data": { "id": 20417, "uid": "019a1d52-3c8e-7f41-b0d2-6a3e9c1f4b21", "title": "Jollof Rice Party Pack", "slug": "jollof-rice-party-pack", "excerpt": "Smoky party jollof for 10, with fried plantain and grilled chicken.", "description": "Firewood-smoked party jollof cooked to order, served with dodo and six pieces of grilled chicken. Feeds 10.", "status": "active", "published": true, "in_stock": true, "price": "18500.00", "storefront_price": "16650.00", "storefront_compare_at_price": "18500.00", "url": "https://adeyemifoods.com/products/jollof-rice-party-pack", "currency": "NGN", "sku": "ADF-JRP-001", "barcode": "6154000102417", "stock": 42, "track_inventory": true, "is_digital": false, "has_variants": false, "image": "https://media.usequeek.com/uploads/stores/1095/jollof-rice-party-pack.jpg", "thumbnail_image": null, "primary_image_url": "https://media.usequeek.com/uploads/stores/1095/jollof-rice-party-pack.jpg", "variants": [], "images": [ { "id": 88214, "is_primary": true, "position": 0, "url": "https://media.usequeek.com/uploads/stores/1095/jollof-rice-party-pack.jpg", "alt": "Jollof rice party pack in a foil tray", "width": 1200, "height": 1200, "variants": { "thumb": { "url": "https://media.usequeek.com/uploads/stores/1095/jollof-rice-party-pack-thumb.webp", "w": null, "h": null }, "card": { "url": "https://media.usequeek.com/uploads/stores/1095/jollof-rice-party-pack-card.webp", "w": 480, "h": 480 }, "card2x": { "url": "https://media.usequeek.com/uploads/stores/1095/jollof-rice-party-pack-card2x.webp", "w": 800, "h": 800 }, "view": { "url": "https://media.usequeek.com/uploads/stores/1095/jollof-rice-party-pack-view.webp", "w": 1200, "h": 1200 }, "wa": { "url": "https://media.usequeek.com/uploads/stores/1095/jollof-rice-party-pack-wa.jpg", "w": 1080, "h": 1080 }, "original": { "url": "https://media.usequeek.com/uploads/stores/1095/jollof-rice-party-pack.jpg", "w": 1200, "h": 1200 } } } ], "metafields": {}, "metadata": { "erp_id": "ERP-20417" }, "created_at": "2026-07-14T10:20:00+01:00", "updated_at": "2026-09-22T16:05:00+01:00", "deleted_at": null }}Requires scope merchant-items-delete.
Deletes a product.
Authorization
merchantKey The store's private API key (sk_live_…, sk_test_… on a dev store) from Dashboard → Settings → API keys. It is bound to one store and carries the scopes the merchant granted; each operation names the scope it needs. Server-side only — never ship it to a browser or an app bundle.
In: header
Path Parameters
Header Parameters
A private API key (sk_live_…, sk_test_… on a dev store) minted under Dashboard → Settings → API keys. The key is bound to ONE store, so no vendor header or vendor_id is sent; its scopes decide which operations it may call. pk_ public keys never reach this API. Keep it on your server.
Your own correlation id (8–128 chars, ^[A-Za-z0-9_.:-]+$). Echoed back on the response and on every log line of the request; one is generated when you omit it.
Retry-safe write key. The same key with the same body replays the stored response for 24h with Idempotent-Replayed: true; with a different body it is 409 idempotency_key_reuse; while the first call is still running it is 409 idempotency_key_in_progress.
Response Body
application/json
application/json
application/json
application/json
application/json
application/json
curl -X DELETE "https://example.com/products/20417" \ -H "X-Client-Key: {{merchantKey}}"{ "status": "success", "message": "Product deleted successfully", "data": { "id": "019a1d52-3c8e-7f41-b0d2-6a3e9c1f4b21", "p_id": 20417, "deleted": true }}Requires scope merchant-items-update.
Replaces a product’s fields; title and the core attributes are required. Answers the updated product — the same object GET products/{product} and products/* webhooks send.
Authorization
merchantKey The store's private API key (sk_live_…, sk_test_… on a dev store) from Dashboard → Settings → API keys. It is bound to one store and carries the scopes the merchant granted; each operation names the scope it needs. Server-side only — never ship it to a browser or an app bundle.
In: header
Path Parameters
Header Parameters
A private API key (sk_live_…, sk_test_… on a dev store) minted under Dashboard → Settings → API keys. The key is bound to ONE store, so no vendor header or vendor_id is sent; its scopes decide which operations it may call. pk_ public keys never reach this API. Keep it on your server.
Your own correlation id (8–128 chars, ^[A-Za-z0-9_.:-]+$). Echoed back on the response and on every log line of the request; one is generated when you omit it.
Retry-safe write key. The same key with the same body replays the stored response for 24h with Idempotent-Replayed: true; with a different body it is 409 idempotency_key_reuse; while the first call is still running it is 409 idempotency_key_in_progress.
Request Body
multipart/form-data
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
application/json
application/json
application/json
application/json
application/json
application/json
application/json
curl -X PUT "https://example.com/products/20417" \ -H "X-Client-Key: {{merchantKey}}" \ -F title="Jollof Rice Party Pack" \ -F price="18500.00" \ -F excerpt="Smoky party jollof for 10, with fried plantain and grilled chicken." \ -F description="Firewood-smoked party jollof cooked to order, served with dodo and six pieces of grilled chicken. Feeds 10." \ -F barcode="6154000102417" \ -F stock="42" \ -F track_inventory="true" \ -F metadata="{ \"erp_id\": \"ERP-20417\" }"{ "status": "success", "message": "product updated", "data": { "id": 20417, "uid": "019a1d52-3c8e-7f41-b0d2-6a3e9c1f4b21", "title": "Jollof Rice Party Pack", "slug": "jollof-rice-party-pack", "excerpt": "Smoky party jollof for 10, with fried plantain and grilled chicken.", "description": "Firewood-smoked party jollof cooked to order, served with dodo and six pieces of grilled chicken. Feeds 10.", "status": "active", "published": true, "in_stock": true, "price": "18500.00", "storefront_price": "16650.00", "storefront_compare_at_price": "18500.00", "url": "https://adeyemifoods.com/products/jollof-rice-party-pack", "currency": "NGN", "sku": "ADF-JRP-001", "barcode": "6154000102417", "stock": 42, "track_inventory": true, "is_digital": false, "has_variants": false, "image": "https://media.usequeek.com/uploads/stores/1095/jollof-rice-party-pack.jpg", "thumbnail_image": null, "primary_image_url": "https://media.usequeek.com/uploads/stores/1095/jollof-rice-party-pack.jpg", "variants": [], "images": [ { "id": 88214, "is_primary": true, "position": 0, "url": "https://media.usequeek.com/uploads/stores/1095/jollof-rice-party-pack.jpg", "alt": "Jollof rice party pack in a foil tray", "width": 1200, "height": 1200, "variants": { "thumb": { "url": "https://media.usequeek.com/uploads/stores/1095/jollof-rice-party-pack-thumb.webp", "w": null, "h": null }, "card": { "url": "https://media.usequeek.com/uploads/stores/1095/jollof-rice-party-pack-card.webp", "w": 480, "h": 480 }, "card2x": { "url": "https://media.usequeek.com/uploads/stores/1095/jollof-rice-party-pack-card2x.webp", "w": 800, "h": 800 }, "view": { "url": "https://media.usequeek.com/uploads/stores/1095/jollof-rice-party-pack-view.webp", "w": 1200, "h": 1200 }, "wa": { "url": "https://media.usequeek.com/uploads/stores/1095/jollof-rice-party-pack-wa.jpg", "w": 1080, "h": 1080 }, "original": { "url": "https://media.usequeek.com/uploads/stores/1095/jollof-rice-party-pack.jpg", "w": 1200, "h": 1200 } } } ], "metafields": {}, "metadata": { "erp_id": "ERP-20417" }, "created_at": "2026-07-14T10:20:00+01:00", "updated_at": "2026-09-22T16:05:00+01:00", "deleted_at": null }}Requires scope merchant-items-update.
Publishes or unpublishes a list of products in one call.
Authorization
merchantKey The store's private API key (sk_live_…, sk_test_… on a dev store) from Dashboard → Settings → API keys. It is bound to one store and carries the scopes the merchant granted; each operation names the scope it needs. Server-side only — never ship it to a browser or an app bundle.
In: header
Header Parameters
A private API key (sk_live_…, sk_test_… on a dev store) minted under Dashboard → Settings → API keys. The key is bound to ONE store, so no vendor header or vendor_id is sent; its scopes decide which operations it may call. pk_ public keys never reach this API. Keep it on your server.
Your own correlation id (8–128 chars, ^[A-Za-z0-9_.:-]+$). Echoed back on the response and on every log line of the request; one is generated when you omit it.
Retry-safe write key. The same key with the same body replays the stored response for 24h with Idempotent-Replayed: true; with a different body it is 409 idempotency_key_reuse; while the first call is still running it is 409 idempotency_key_in_progress.
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
application/json
application/json
application/json
application/json
application/json
application/json
application/json
curl -X POST "https://example.com/products/publish" \ -H "X-Client-Key: {{merchantKey}}" \ -H "Content-Type: application/json" \ -d '{ "ids": [ "019a1d52-3c8e-7f41-b0d2-6a3e9c1f4b21", "019a1d52-3c8e-7f41-b0d2-6a3e9c1f4b22" ], "published": true }'{ "status": "success", "message": "2 products published successfully", "data": { "count": 2, "published": true }}