Queek docs
Merchant endpoint reference

Products

GET
/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
X-Client-Key<token>

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

limit?|
Range1 <= value <= 100
starting_after?string|null
sort_by?|

Value in

  • "created_at"
  • "updated_at"
  • "title"
  • "price"
  • "stock"
  • "published"
  • null
sort_order?string|null
search?string|null
category_id?|
Formatuuid
taxonomy_category_id?|
Formatuuid
collection_category_id?|
Formatuuid
stock_status?string|null
import_id?|
Formatuuid
batch_id?|
Formatuuid
channel?string|null
is_marketplace?|

Value in

  • "0"
  • "1"
  • "true"
  • "false"
  • null
is_wholesale?|

Value in

  • "0"
  • "1"
  • "true"
  • "false"
  • null
metafield[]?array<string>|null
updated_after?string

Header Parameters

X-Client-Key*string

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.

X-Request-Id?string

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"}
POST
/products

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
X-Client-Key<token>

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

X-Client-Key*string

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.

X-Request-Id?string

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.

Idempotency-Key?string

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  }}
GET
/storefront/search

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
X-Client-Key<token>

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

keyword?|
Length2 <= length <= 100
in_stock?|

Value in

  • "0"
  • "1"
  • "true"
  • "false"
  • null
metafield[]?array<string>|

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.

Itemsitems <= 5
sort?|

Value in

  • "latest"
  • "popular"
  • "price_low"
  • "price_high"
  • null
limit?|
Range1 <= value <= 100
starting_after?|

StorefrontCursor's signed envelope is not Laravel's raw Cursor.

Header Parameters

X-Client-Key*string

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.

X-Request-Id?string

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"}
GET
/products/{product}

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
X-Client-Key<token>

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

product*string

Header Parameters

X-Client-Key*string

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.

X-Request-Id?string

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  }}
DELETE
/products/{product}

Requires scope merchant-items-delete.

Deletes a product.

Authorization

merchantKey
X-Client-Key<token>

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

product*string

Header Parameters

X-Client-Key*string

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.

X-Request-Id?string

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.

Idempotency-Key?string

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  }}
PUT
/products/{product}

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
X-Client-Key<token>

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

product*string

Header Parameters

X-Client-Key*string

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.

X-Request-Id?string

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.

Idempotency-Key?string

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  }}
POST
/products/publish

Requires scope merchant-items-update.

Publishes or unpublishes a list of products in one call.

Authorization

merchantKey
X-Client-Key<token>

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

X-Client-Key*string

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.

X-Request-Id?string

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.

Idempotency-Key?string

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  }}