Skip to content

Catering (Event Menus)

Event menus are time-boxed catering menus tied to a specific event date (e.g. holiday catering, game-day platters). Customers browse the available event menus for a location, check capacity, and place a pre-order for a pickup slot. Event-menu orders are created unpaid (pay_later); the balance is collected later via an Invoice.

Discovery is public; placing an order requires the kitchenclick:orders.create scope.

List Available Event Menus

GET /v1/ecommerce/locations/{location}/concepts/{concept}/event-menus

Authentication: None (Public)

Rate Limit: 100/min per IP

Path Parameters

ParameterTypeDescription
locationstringLocation ID (e.g. loc_00000k1L2m3N4o5)
conceptstringConcept ID (e.g. con_00000a1B2c3D4e5)

Only event menus that are open and whose order deadline has not passed are returned, ordered by event date. An empty array is returned when none are available.

Response

json
{
  "status": "success",
  "data": [
    {
      "event_menu_id": "evm_00000a1B2c3D4e5",
      "name": "Holiday Catering 2026",
      "slug": "holiday-catering-2026",
      "event_type": "holiday",
      "event_date": "2026-12-25",
      "order_open_date": "2026-11-01",
      "order_deadline": "2026-12-20T23:59:59Z",
      "fulfillment_date_start": "2026-12-24",
      "fulfillment_date_end": "2026-12-25",
      "is_ordering_open": true,
      "menu_id": "mnu_00000z9Y8x7W6v5",
      "capacity": {
        "max_orders": 50,
        "total_orders": 12,
        "remaining": 38,
        "max_per_slot": 10,
        "slots": { "10:00": 3, "12:00": 4, "14:00": 5 }
      },
      "available_pickup_slots": ["10:00", "11:00", "12:00", "14:00"]
    }
  ]
}
FieldTypeDescription
event_menu_idstringEvent menu ID (prefix evm_)
event_typestringholiday, seasonal, special_event, or custom
event_datestringYYYY-MM-DD event date
order_deadlinestringISO 8601 cutoff for placing orders
is_ordering_openbooleanWhether orders are currently accepted
menu_idstringThe linked menu — fetch its items via the Menus API
capacityobjectOrder/slot capacity summary (null if uncapped)
available_pickup_slotsarrayPickup time slots with remaining capacity

Get Event Menu Availability

Re-check capacity and pickup slots for a single event menu (call before submitting an order to avoid a rejected slot).

GET /v1/ecommerce/event-menus/{eventMenu}/availability

Authentication: None (Public)

Rate Limit: 100/min per IP

Path Parameters

ParameterTypeDescription
eventMenustringEvent menu ID (e.g. evm_00000a1B2c3D4e5)

Response

json
{
  "status": "success",
  "data": {
    "event_menu": {
      "event_menu_id": "evm_00000a1B2c3D4e5",
      "name": "Holiday Catering 2026",
      "event_type": "holiday",
      "event_date": "2026-12-25",
      "order_deadline": "2026-12-20T23:59:59Z",
      "menu_id": "mnu_00000z9Y8x7W6v5"
    },
    "is_ordering_open": true,
    "order_deadline": "2026-12-20T23:59:59Z",
    "capacity": {
      "max_orders": 50,
      "total_orders": 12,
      "remaining": 38,
      "max_per_slot": 10,
      "slots": { "10:00": 3, "12:00": 4 }
    },
    "available_pickup_slots": ["10:00", "11:00", "12:00", "14:00"]
  }
}

Errors

StatusCondition
404Event menu not found

Create Event Menu Order

Place a catering pre-order. The order is created unpaid; collect the balance later via the Invoices API.

POST /v1/ecommerce/event-menus/{eventMenu}/orders

Authentication: OAuth Token

Scope: kitchenclick:orders.create

Rate Limit: 30/min per client

Path Parameters

ParameterTypeDescription
eventMenustringEvent menu ID (e.g. evm_00000a1B2c3D4e5)

Request Body

json
{
  "location_id": "loc_00000k1L2m3N4o5",
  "items": [
    {
      "item_id": "itm_00000a1B2c3D4e5",
      "quantity": 2,
      "customizations": [
        { "modifier_id": "mod_no_nuts", "options": ["no_nuts"] }
      ],
      "special_instructions": "Extra crispy"
    }
  ],
  "pickup_slot": "10:00",
  "customer_name": "Jane Doe",
  "customer_email": "jane@example.com",
  "customer_phone": "(555) 123-4567",
  "special_instructions": "No nuts please"
}
FieldTypeRequiredDescription
location_idstringYesPickup location ID; must be associated with the event menu's concept
itemsarrayYesAt least one line item
items[].item_idstringYesMenu item ID
items[].quantityintegerYesQuantity (≥ 1)
items[].customizationsarrayNoSelected modifiers: [{ modifier_id, options: [] }]
items[].special_instructionsstringNoPer-item note (≤ 255 chars)
pickup_slotstringNoPickup time slot, e.g. "10:00" (≤ 20 chars); must be an available slot
customer_namestringYesCustomer name (≤ 255 chars)
customer_emailstringNoCustomer email
customer_phonestringYesCustomer phone (≤ 50 chars)
special_instructionsstringNoOrder-level note (≤ 1000 chars)

Response — 201 Created

json
{
  "status": "success",
  "data": {
    "order_id": "ord_00000x1Y2z3A4b5",
    "order_number": 1047,
    "friendly_number": "#1047",
    "event_menu_id": "evm_00000a1B2c3D4e5",
    "pickup_slot": "10:00",
    "scheduled_at": "2026-12-25T10:00:00Z",
    "total_amount": 156.75,
    "status": "open"
  }
}
FieldTypeDescription
order_idstringCreated order ID (prefix ord_) — track via GET /orders/{order}/track
order_numberintegerSequential order number
friendly_numberstringDisplay order number, e.g. #1047
scheduled_atstringPickup datetime (UTC) derived from event_date + pickup_slot
total_amountnumberOrder total
statusstringOrder status (open for new pre-orders)

Errors

StatusMessageCondition
404Event menu not found.Unknown event menu
404This event menu is not available at the selected location.location_id not tied to the concept
422Ordering is not currently open for this event menu.Before open date or after deadline
422This event menu has reached maximum capacity.Total order cap reached
422Pickup slot '{slot}' is full.Selected slot at capacity
422Some items are no longer available.One or more items 86'd / not live (see unavailable array)
422(validation)Missing/invalid fields — errors map per field

Changelog
DateChange
2026-06-17Initial publication.

ShopHero CommerceCore Platform