API referenceMenu items

Menu items

5 operations. Every schema and example on this page is generated from the platform contract.

List a store’s menu items.

Merchant read of the store’s menu items. Removed items (soft-deleted) are excluded; merchant-hidden items are included (flagged via is_available/checkout_enabled).

Parameters

store_idstring · uuidqueryrequired

Store whose menu to list (also authorises the merchant).

Response, 200

itemsarray of objectrequired
25 child fields
idstringrequired
namestringrequired
descriptionstring, nullablerequired
categorystring, nullablerequired
emojistring, nullablerequired
image_urlstring, nullablerequired
product_mediaarray of objectrequired
5 child fields
idstringrequired
typeenumrequired
imagevideo
urlstringrequired
thumbnail_urlstring, nullablerequired
sort_ordernumberrequired
contains_allergensarray of stringrequired
no_allergensbooleanrequired

FA078. True ONLY when a human ticked "no allergens in this item". An empty contains_allergens with no_allergens=false means NOBODY HAS SAID, it is not a statement that the item is allergen-free, and must never be rendered as one.

dietary_tagsarray of stringrequired
ingredientsstring, nullablerequired
nutrition_summarystring, nullablerequired
is_popularbooleanrequired
is_availablebooleanrequired
checkout_enabledbooleanrequired
stock_tracking_enabledbooleanrequired
stock_quantitynumber, nullablerequired
stock_remainingnumber, nullablerequired
sold_outbooleanrequired
collect_eligiblebooleanrequired
available_nowbooleanrequired
collect_prep_minutesnumber, nullablerequired
price_pencenumberrequired
currencystringrequired
sort_ordernumberrequired
curl -G "https://www.membber.com/api/v1/menu-items" \
  -H "Authorization: Bearer $MEMBBER_TOKEN" \
  --data-urlencode "store_id=6659c139-0000-4000-8000-d0c500000066"
Response, 200
{
  "items": [
    {
      "id": "00000d1b-0000-4000-8000-d0c500000000",
      "name": "Example name",
      "description": "Added at the front desk",
      "category": "<category>",
      "emoji": "<emoji>",
      "image_url": "https://example.com/image.jpg",
      "product_media": [
        {
          "id": "00000d1b-0000-4000-8000-d0c500000000",
          "type": "image",
          "url": "https://example.com/image.jpg",
          "thumbnail_url": "https://example.com/image.jpg",
          "sort_order": 1
        }
      ],
      "contains_allergens": [
        "<contains_allergen>"
      ],
      "no_allergens": true,
      "dietary_tags": [
        "<dietary_tag>"
      ],
      "ingredients": "<ingredients>",
      "nutrition_summary": "<nutrition_summary>",
      "is_popular": true,
      "is_available": true,
      "checkout_enabled": true,
      "stock_tracking_enabled": true,
      "stock_quantity": 1,
      "stock_remaining": 1,
      "sold_out": true,
      "collect_eligible": true,
      "available_now": true,
      "collect_prep_minutes": 1,
      "price_pence": 1500,
      "currency": "GBP",
      "sort_order": 1
    }
  ]
}

Create a store menu item.

Merchant creates a menu item. The service validates name + price and normalises all fields. Broadcasts a menu_item_created realtime event so customer apps re-pull the menu. No HTTP idempotency key (identical to the legacy route), a create is not deduplicated.

Request body

store_idstring · uuidrequired

Store the item belongs to (also authorises the merchant).

namestringrequired

Item name (required; max 120 chars).

price_penceintegerrequired

Price in pence (required; 0..10,000,000).

descriptionstring, nullableoptional
categorystring, nullableoptional
emojistring, nullableoptional
image_urlstring, nullableoptional
product_mediaarray of anyoptional
currencystringoptional
contains_allergensarray of stringoptional
no_allergensbooleanoptional

FA078. Tick "no allergens in this item". OMIT to leave any existing declaration untouched; false retracts it. Ignored when contains_allergens is non-empty, listing an allergen always withdraws a standing "none" declaration.

dietary_tagsarray of stringoptional
ingredientsstring, nullableoptional
nutrition_summarystring, nullableoptional
is_popularbooleanoptional
is_availablebooleanoptional
checkout_enabledbooleanoptional
collect_eligiblebooleanoptional
available_nowbooleanoptional
collect_prep_minutesinteger, nullableoptional
sort_orderintegeroptional
stock_tracking_enabledbooleanoptional
stock_quantityinteger, nullableoptional
stock_remaininginteger, nullableoptional

Response, 200

itemobjectrequired

A menu_items row (write result, raw DB shape).

7 child fields
idstringrequired
store_idstringrequired
namestringrequired
price_pencenumber, nullableoptional
currencystring, nullableoptional
is_availableboolean, nullableoptional
checkout_enabledboolean, nullableoptional
curl -X POST "https://www.membber.com/api/v1/menu-items" \
  -H "Authorization: Bearer $MEMBBER_TOKEN" \
  -H "Idempotency-Key: 1f0e2d3c-4b5a-4678-9abc-def012345678" \
  -H "Content-Type: application/json" \
  -d '{
    "store_id": "6659c139-0000-4000-8000-d0c500000066",
    "name": "Example name",
    "price_pence": 1500
  }'
Response, 200
{
  "item": {
    "id": "00000d1b-0000-4000-8000-d0c500000000",
    "store_id": "6659c139-0000-4000-8000-d0c500000066",
    "name": "Example name",
    "price_pence": 1500,
    "currency": "GBP",
    "is_available": true,
    "checkout_enabled": true
  }
}

Remove (soft-delete) a store menu item.

Merchant removes a menu item. Soft delete (order-history integrity): flips visibility AND stamps deleted_at so the list can tell a REMOVED item apart from a merchant-HIDDEN one. Broadcasts a menu_item_archived realtime event. Idempotent. store_id is supplied as a query parameter.

Parameters

itemIdstringpathrequired
store_idstring · uuidqueryrequired

Store the item belongs to (also authorises the merchant).

Response, 200

archivedbooleanrequired
curl -X DELETE "https://www.membber.com/api/v1/menu-items/b9bf0b8e-0000-4000-8000-d0c5000000b9?store_id=6659c139-0000-4000-8000-d0c500000066" \
  -H "Authorization: Bearer $MEMBBER_TOKEN" \
  -H "Idempotency-Key: 1f0e2d3c-4b5a-4678-9abc-def012345678"
Response, 200
{
  "archived": true
}

Update a store menu item.

Merchant updates a menu item. Stock edits preserve in-flight reservations (set_menu_item_stock); a plain edit cannot silently resurrect a removed item (409 ITEM_ARCHIVED unless restore is intended). Broadcasts a menu_item_updated realtime event. Idempotent (converges).

Parameters

itemIdstringpathrequired

Request body

store_idstring · uuidrequired

Store the item belongs to (also authorises the merchant).

namestringrequired

Item name (required; max 120 chars).

price_penceintegerrequired

Price in pence (required; 0..10,000,000).

descriptionstring, nullableoptional
categorystring, nullableoptional
emojistring, nullableoptional
image_urlstring, nullableoptional
product_mediaarray of anyoptional
currencystringoptional
contains_allergensarray of stringoptional
no_allergensbooleanoptional

FA078. Tick "no allergens in this item". OMIT to leave any existing declaration untouched; false retracts it. Ignored when contains_allergens is non-empty, listing an allergen always withdraws a standing "none" declaration.

dietary_tagsarray of stringoptional
ingredientsstring, nullableoptional
nutrition_summarystring, nullableoptional
is_popularbooleanoptional
is_availablebooleanoptional
checkout_enabledbooleanoptional
collect_eligiblebooleanoptional
available_nowbooleanoptional
collect_prep_minutesinteger, nullableoptional
sort_orderintegeroptional
stock_tracking_enabledbooleanoptional
stock_quantityinteger, nullableoptional
stock_remaininginteger, nullableoptional

Response, 200

itemobjectrequired

A menu_items row (write result, raw DB shape).

7 child fields
idstringrequired
store_idstringrequired
namestringrequired
price_pencenumber, nullableoptional
currencystring, nullableoptional
is_availableboolean, nullableoptional
checkout_enabledboolean, nullableoptional
curl -X PATCH "https://www.membber.com/api/v1/menu-items/b9bf0b8e-0000-4000-8000-d0c5000000b9" \
  -H "Authorization: Bearer $MEMBBER_TOKEN" \
  -H "Idempotency-Key: 1f0e2d3c-4b5a-4678-9abc-def012345678" \
  -H "Content-Type: application/json" \
  -d '{
    "store_id": "6659c139-0000-4000-8000-d0c500000066",
    "name": "Example name",
    "price_pence": 1500
  }'
Response, 200
{
  "item": {
    "id": "00000d1b-0000-4000-8000-d0c500000000",
    "store_id": "6659c139-0000-4000-8000-d0c500000066",
    "name": "Example name",
    "price_pence": 1500,
    "currency": "GBP",
    "is_available": true,
    "checkout_enabled": true
  }
}

Reorder the menu’s sections.

Merchant sets the order their menu sections appear in. The customer menu derives section order from each section’s first appearance in the sort_order-sorted item list, so this renumbers every item’s sort_order in ONE atomic statement (menu_reorder_sections RPC), item order inside a section is preserved byte for byte; only whole sections move. Idempotent (same payload converges to the same numbering). Broadcasts a menu_item_updated realtime event so customer apps re-pull the menu.

Request body

store_idstring · uuidrequired

Store whose menu sections to reorder (also authorises the merchant).

sectionsarray of stringrequired

Every menu section (item category name) in the merchant’s chosen order, first to last. Matching is case- and whitespace-insensitive. Sections not named here (including uncategorised items) keep their current relative order after the named ones, on the menu, never lost.

Response, 200

itemsarray of objectrequired
25 child fields
idstringrequired
namestringrequired
descriptionstring, nullablerequired
categorystring, nullablerequired
emojistring, nullablerequired
image_urlstring, nullablerequired
product_mediaarray of objectrequired
5 child fields
idstringrequired
typeenumrequired
imagevideo
urlstringrequired
thumbnail_urlstring, nullablerequired
sort_ordernumberrequired
contains_allergensarray of stringrequired
no_allergensbooleanrequired

FA078. True ONLY when a human ticked "no allergens in this item". An empty contains_allergens with no_allergens=false means NOBODY HAS SAID, it is not a statement that the item is allergen-free, and must never be rendered as one.

dietary_tagsarray of stringrequired
ingredientsstring, nullablerequired
nutrition_summarystring, nullablerequired
is_popularbooleanrequired
is_availablebooleanrequired
checkout_enabledbooleanrequired
stock_tracking_enabledbooleanrequired
stock_quantitynumber, nullablerequired
stock_remainingnumber, nullablerequired
sold_outbooleanrequired
collect_eligiblebooleanrequired
available_nowbooleanrequired
collect_prep_minutesnumber, nullablerequired
price_pencenumberrequired
currencystringrequired
sort_ordernumberrequired
curl -X PUT "https://www.membber.com/api/v1/menu-items/section-order" \
  -H "Authorization: Bearer $MEMBBER_TOKEN" \
  -H "Idempotency-Key: 1f0e2d3c-4b5a-4678-9abc-def012345678" \
  -H "Content-Type: application/json" \
  -d '{
    "store_id": "6659c139-0000-4000-8000-d0c500000066",
    "sections": [
      "<section>"
    ]
  }'
Response, 200
{
  "items": [
    {
      "id": "00000d1b-0000-4000-8000-d0c500000000",
      "name": "Example name",
      "description": "Added at the front desk",
      "category": "<category>",
      "emoji": "<emoji>",
      "image_url": "https://example.com/image.jpg",
      "product_media": [
        {
          "id": "00000d1b-0000-4000-8000-d0c500000000",
          "type": "image",
          "url": "https://example.com/image.jpg",
          "thumbnail_url": "https://example.com/image.jpg",
          "sort_order": 1
        }
      ],
      "contains_allergens": [
        "<contains_allergen>"
      ],
      "no_allergens": true,
      "dietary_tags": [
        "<dietary_tag>"
      ],
      "ingredients": "<ingredients>",
      "nutrition_summary": "<nutrition_summary>",
      "is_popular": true,
      "is_available": true,
      "checkout_enabled": true,
      "stock_tracking_enabled": true,
      "stock_quantity": 1,
      "stock_remaining": 1,
      "sold_out": true,
      "collect_eligible": true,
      "available_now": true,
      "collect_prep_minutes": 1,
      "price_pence": 1500,
      "currency": "GBP",
      "sort_order": 1
    }
  ]
}
WhatsApp
Book a Call
Start Free