Menu
The POS Menu API provides unified menu management across all brands, encompassing items, categories, modifier sets, modifiers, and tax configurations. Retrieve the complete menu structure including nested modifiers for complex menu configurations.
The menu response structure
The menu endpoint returns a comprehensive menu structure with all related entities in a single response.
Properties
- Name
categories- Type
- array
- Description
Array of menu categories with display names and associated items.
- Name
items- Type
- array
- Description
Array of menu items with prices, descriptions, and modifier set references.
- Name
modifierSets- Type
- array
- Description
Array of modifier sets (option groups) with min/max selection rules.
- Name
modifiers- Type
- array
- Description
Array of individual modifiers with prices and nested modifier set support.
- Name
taxes- Type
- array
- Description
Array of tax configurations applicable to menu items.
- Name
maxModifiersLevel- Type
- number
- Description
Maximum depth of nested modifiers supported (modifiers on modifiers).
Retrieve menu
Retrieve the complete menu structure for a location including all categories, items, modifiers, and tax configurations. All prices are returned in US cents.
Path parameters
- Name
locationId- Type
- integer
- Description
The unique identifier for the location. Required.
Request
curl -X GET \
'https://conecto-api.shift4payments.com/api/pos/v2/244/menu' \
-H 'x-access-key: YOUR_CLIENT_ID' \
-H 'x-timestamp: 1709251200' \
-H 'x-signature: YOUR_SIGNATURE'
Response
{
"categories": [
{
"posRef": "cat-001",
"name": "Appetizers",
"description": "Starter dishes",
"items": ["item-001", "item-002"],
"isActive": true
},
{
"posRef": "cat-002",
"name": "Entrees",
"description": "Main courses",
"items": ["item-003"],
"isActive": true
}
],
"items": [
{
"posRef": "item-001",
"name": "Caesar Salad",
"description": "Fresh romaine lettuce",
"price": 1299,
"taxes": ["tax-001"],
"modifierSets": ["modset-001"],
"isActive": true,
"isSoldByWeight": false,
"upc": "123456789",
"sku": "SAL-001"
},
{
"posRef": "item-002",
"name": "Buffalo Wings",
"description": "Spicy chicken wings",
"price": 1499,
"taxes": ["tax-001"],
"modifierSets": ["modset-002"],
"isActive": true,
"isSoldByWeight": false
}
],
"modifierSets": [
{
"posRef": "modset-001",
"name": "Dressing Options",
"description": "Choose your dressing",
"minModifiersPerSet": 1,
"maxModifiersPerSet": 1,
"modifiers": ["mod-001", "mod-002"],
"isActive": true,
"defaultModifierPrice": {
"type": "amount",
"amount": 0
}
},
{
"posRef": "modset-002",
"name": "Sauce Selection",
"description": "Pick your sauce",
"minModifiersPerSet": null,
"maxModifiersPerSet": 2,
"modifiers": ["mod-003", "mod-004"],
"isActive": true
}
],
"modifiers": [
{
"posRef": "mod-001",
"name": "Caesar Dressing",
"description": "Classic caesar",
"isActive": true,
"defaultPrice": {
"type": "amount",
"amount": 0
},
"prices": [
{
"modifierSetRef": "modset-001",
"price": {
"type": "amount",
"amount": 0
}
}
],
"inheritsItemTax": true,
"modifierSets": []
},
{
"posRef": "mod-002",
"name": "Ranch Dressing",
"description": "Creamy ranch",
"isActive": true,
"defaultPrice": {
"type": "amount",
"amount": 50
},
"prices": [
{
"modifierSetRef": "modset-001",
"price": {
"type": "amount",
"amount": 50
}
}
],
"inheritsItemTax": true,
"modifierSets": []
}
],
"taxes": [
{
"posRef": "tax-001",
"name": "Sales Tax",
"isActive": true,
"rate": {
"type": "percent",
"percent": 82500
}
}
],
"maxModifiersLevel": 2
}
Menu data models
Menu Category
Represents a menu category (section) containing menu items.
- Name
posRef- Type
- string
- Description
Unique category identifier. Required.
- Name
name- Type
- string
- Description
Display name in POS. Required.
- Name
description- Type
- string
- Description
Server-facing description. Optional.
- Name
items- Type
- array
- Description
Array of item posRef values. Order matters for display. Required.
- Name
isActive- Type
- boolean
- Description
Whether the category is currently active. Required.
Menu Item
Represents an individual menu item with pricing and modifiers.
- Name
posRef- Type
- string
- Description
Unique item identifier. Required.
- Name
name- Type
- string
- Description
POS display name. Required.
- Name
description- Type
- string
- Description
Item description. Optional.
- Name
price- Type
- number
- Description
Base price in US cents. Optional.
- Name
taxes- Type
- array
- Description
Array of tax posRef values to apply. Optional.
- Name
modifierSets- Type
- array
- Description
Ordered array of modifier set posRef values. Required.
- Name
isActive- Type
- boolean
- Description
Availability status. Required.
- Name
isSoldByWeight- Type
- boolean
- Description
True if sold by weight, false if sold by quantity. Required.
- Name
upc- Type
- string
- Description
Universal Product Code for scanning. Optional.
- Name
sku- Type
- string
- Description
Stock keeping unit identifier. Optional.
Modifier Set
Represents a group of modifiers with selection rules.
- Name
posRef- Type
- string
- Description
Unique set identifier. Required.
- Name
name- Type
- string
- Description
Display name (e.g., "Size", "Toppings"). Required.
- Name
description- Type
- string
- Description
Additional context. Optional.
- Name
minModifiersPerSet- Type
- number
- Description
Minimum selections required. Null means no minimum. Optional.
- Name
maxModifiersPerSet- Type
- number
- Description
Maximum selections allowed. Null means unlimited. Optional.
- Name
modifiers- Type
- array
- Description
Ordered array of modifier posRef values. Required.
- Name
isActive- Type
- boolean
- Description
Availability status. Required.
- Name
defaultModifierPrice- Type
- object
- Description
Fallback pricing if modifier doesn't specify price. Optional.
Modifier
Represents an individual modifier option with pricing and support for nested modifiers.
- Name
posRef- Type
- string
- Description
Unique modifier identifier. Required.
- Name
name- Type
- string
- Description
Display name (e.g., "Extra Cheese", "No Onions"). Required.
- Name
description- Type
- string
- Description
Details. Optional.
- Name
sku- Type
- string
- Description
Stock unit code. Optional.
- Name
taxes- Type
- array
- Description
Associated tax posRef values. Optional.
- Name
isActive- Type
- boolean
- Description
Availability status. Required.
- Name
defaultPrice- Type
- object
- Description
Base modification cost. Optional.
- Name
prices- Type
- array
- Description
Set-specific pricing options (overrides defaultPrice). Required.
- Name
inheritsItemTax- Type
- boolean
- Description
Whether to inherit tax from parent item. Optional.
- Name
modifierSets- Type
- array
- Description
Array of nested modifier set posRef values (supports multi-level modifiers). Required.
Price Object
- Name
type- Type
- string
- Description
Either "amount" (flat fee) or "percent" (percentage of item price). Required.
- Name
amount- Type
- number
- Description
Price in US cents. Required when type="amount".
- Name
percent- Type
- number
- Description
Percentage value divided by 10,000. Required when type="percent". Example: 100,000 = 10%, 5,000 = 0.5%.
Working with nested modifiers
The SkyTab POS API supports nested modifiers (modifiers on modifiers), allowing complex menu configurations. The maxModifiersLevel field indicates the maximum depth.
Example: Pizza with nested toppings
{
"items": [{
"name": "Custom Pizza",
"modifierSets": ["size-set"]
}],
"modifierSets": [
{
"posRef": "size-set",
"name": "Size",
"modifiers": ["size-large", "size-small"]
},
{
"posRef": "toppings-set",
"name": "Toppings",
"modifiers": ["topping-pepperoni", "topping-mushrooms"]
},
{
"posRef": "cooking-style-set",
"name": "Cooking Style",
"modifiers": ["well-done", "normal"]
}
],
"modifiers": [
{
"posRef": "size-large",
"name": "Large",
"modifierSets": ["toppings-set"]
},
{
"posRef": "topping-pepperoni",
"name": "Pepperoni",
"modifierSets": ["cooking-style-set"]
}
]
}
In this example:
- Selecting "Large" reveals topping options
- Selecting "Pepperoni" reveals cooking style options
- This creates a 3-level hierarchy: Item → Size → Toppings → Cooking Style
Best practices
Caching menu data
Menu data changes infrequently. Consider:
- Cache the complete menu response locally
- Refresh cache every 15-30 minutes
- Subscribe to menu update webhooks for real-time changes
- Use conditional requests with ETags if supported
Handling prices
All monetary amounts are in US cents:
- Display: Divide by 100 (e.g., 1299 cents = $12.99)
- Calculations: Keep in cents until final display
- Tax percentages: Divide by 10,000 (e.g., 82,500 = 8.25%)
Building the menu hierarchy
- Start with categories to organize the menu structure
- For each category, lookup items using the
itemsarray - For each item, lookup modifier sets using
modifierSetsarray - For each modifier set, lookup modifiers using
modifiersarray - For nested modifiers, recursively lookup
modifierSetson each modifier
Min/Max modifiers
nullvalues mean no restriction- Validate selections before submitting orders
minModifiersPerSet: Customer must select at least this manymaxModifiersPerSet: Customer can select at most this many