{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://raw.githubusercontent.com/api-evangelist/lightspeed/main/json-schema/lightspeed-ape-menu-v2-schema.json",
  "title": "apeMenuV2",
  "x-generated": "2026-10-12",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/lightspeed-order-and-pay-api-openapi.yml#/components/schemas/apeMenuV2",
  "properties": {
    "menuName": {
      "description": "The name of the menu.",
      "type": "string"
    },
    "menuEntryGroups": {
      "description": "Menu groups of this menu. The top-level entry will always be of type \"group\", representing a menu screen. Beneath each `menuEntryGroup` will be a `menuEntry` array containing any combination of one or more menu entries:\n* A `menuItemEntry` represents an individual item and may include product modifier groups.\n* A `menuGroupEntry` represents a menu sub-screen.\n* A `menuDealEntry` represents a combo.\n* A `menuProductModifierEntry` represents a product modifier.",
      "items": {
        "$ref": "#/$defs/apeTopLevelMenuGroupEntryV2"
      },
      "type": "array"
    },
    "richDataMissing": {
      "description": "Indicates whether or not rich item data is missing, if requested.",
      "type": "boolean"
    },
    "ikentooMenuId": {
      "type": "integer",
      "description": "The unique identifier for the menu.",
      "format": "int64"
    },
    "conditionalTaxRules": {
      "description": "Warning that actual tax depends on a POS Account condition and may be different from what is provided in this API.",
      "type": "boolean"
    }
  },
  "type": "object",
  "$defs": {
    "apeItemRichData": {
      "type": "object",
      "properties": {
        "squareImageUrl": {
          "description": "A download link for the image associated with this item, as formatted for display in the POS.",
          "type": "string"
        },
        "rawImageUrl": {
          "description": "A download link for the image associated with this item.",
          "type": "string"
        },
        "previewImageUrl": {
          "description": "A download link for the preview image associated with this item.",
          "type": "string"
        },
        "containsAlcohol": {
          "description": "Flag to indicate if the item contains alcohol.",
          "type": "boolean"
        },
        "alcoholPercentage": {
          "description": "The percentage of alcohol in the item.",
          "type": "number"
        },
        "texts": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/apeItemTexts"
          }
        },
        "allergenCodes": {
          "description": "The allergen codes associated with this item.",
          "uniqueItems": true,
          "type": "array",
          "items": {
            "type": "string"
          }
        }
      }
    },
    "apeItemTexts": {
      "type": "object",
      "properties": {
        "locale": {
          "type": "string",
          "description": "The two letter language code associated with this item text."
        },
        "friendlyDisplayName": {
          "type": "string",
          "description": "The display name for this item in the configured language."
        },
        "description": {
          "type": "string",
          "description": "The descriptive text for this item in the configured language."
        }
      }
    },
    "apeMenuDealEntryV2": {
      "title": "menuDeal",
      "allOf": [
        {
          "type": "object",
          "properties": {
            "@type": {
              "type": "string",
              "description": "Indicates the item is a Combo.",
              "enum": [
                "menuDeal"
              ]
            },
            "items": {
              "description": "List of items to select from.",
              "type": "array",
              "items": {
                "$ref": "#/$defs/apeMenuItemEntryV2"
              }
            },
            "menuDealGroups": {
              "type": "array",
              "description": "Array of Items in the Combo",
              "items": {
                "$ref": "#/$defs/apeMenuDealGroupV2"
              }
            }
          }
        },
        {
          "$ref": "#/$defs/apeMenuItemEntryParentV2"
        }
      ]
    },
    "apeMenuDealGroupV2": {
      "type": "object",
      "properties": {
        "description": {
          "type": "string",
          "description": "Description of the combo item grouping."
        },
        "sku": {
          "type": "string",
          "description": "The SKU of the combo item grouping."
        },
        "mustSelectAnItem": {
          "type": "boolean",
          "description": "Whether or not this is a required selection."
        },
        "multiSelectionPermitted": {
          "type": "boolean",
          "description": "Whether or not multiple items can be selected from this item grouping."
        },
        "minimumSelection": {
          "type": "integer",
          "format": "int32",
          "description": "The minimum number of items that must be selected from this item grouping. If null then no minimum is set."
        },
        "maximumSelection": {
          "type": "integer",
          "format": "int32",
          "description": "The maximum number of items that can be selected from this item grouping. If null then no maximum is set."
        },
        "itemRichData": {
          "$ref": "#/$defs/apeItemRichData"
        },
        "items": {
          "description": "List of items to select from.",
          "type": "array",
          "items": {
            "$ref": "#/$defs/apeMenuItemEntryV2"
          }
        }
      },
      "description": "Collections of item groups within the combo to select from."
    },
    "apeMenuGroupEntryV2": {
      "title": "group",
      "allOf": [
        {
          "type": "object",
          "properties": {
            "@type": {
              "type": "string",
              "description": "Indicates this is a menu group.",
              "enum": [
                "group"
              ]
            },
            "id": {
              "type": "string",
              "description": "The menu group ID."
            },
            "name": {
              "type": "string",
              "description": "The menu group name."
            },
            "color": {
              "type": "string",
              "description": "The color of the button in the POS."
            },
            "menuEntry": {
              "type": "array",
              "description": "Array of menu entry objects.",
              "items": {
                "type": "object",
                "oneOf": [
                  {
                    "$ref": "#/$defs/apeMenuItemEntryV2"
                  },
                  {
                    "$ref": "#/$defs/apeMenuDealEntryV2"
                  },
                  {
                    "$ref": "#/$defs/apeMenuGroupEntryV2"
                  },
                  {
                    "$ref": "#/$defs/apeMenuProductModifierEntryV2"
                  }
                ]
              }
            }
          }
        }
      ]
    },
    "apeMenuItemEntryParentV2": {
      "properties": {
        "productName": {
          "type": "string",
          "description": "The name of the item."
        },
        "productPrice": {
          "type": "number",
          "description": "The price of the item."
        },
        "extraPrice": {
          "type": "number",
          "description": "Additional item price when selected in a combo group."
        },
        "color": {
          "type": "string",
          "description": "The color of the menu button for this item."
        },
        "sku": {
          "type": "string",
          "description": "The SKU of the item."
        },
        "customItemNameEnabled": {
          "type": "boolean",
          "description": "Whether the name of the item can be customized."
        },
        "pricingStrategy": {
          "type": "string",
          "description": "The pricing type of the item.",
          "enum": [
            "CUSTOMIZED_ITEM_PRICE_WILL_BE_NEGATIVE",
            "CUSTOMIZED_ITEM_PRICE_WILL_BE_POSTIVE",
            "CUSTOMIZED_ITEM_PRICE_WILL_BE_A_PERCENTAGE_OF_TOTAL",
            "PRICE_CANNOT_BE_CUSTOMIZED"
          ]
        },
        "itemRichData": {
          "$ref": "#/$defs/apeItemRichData"
        },
        "defaultTaxAmount": {
          "description": "The tax amount as calculated at the default tax rate (a sum for multiple taxes).",
          "type": "number"
        },
        "defaultTaxPercentage": {
          "description": "The default tax percentage for this item (a sum for multiple taxes).",
          "type": "number"
        },
        "taxIncludedInPrice": {
          "description": "Whether or not tax is included in the price of the item.",
          "type": "boolean"
        },
        "conditionalTaxRules": {
          "description": "Warning that actual tax depends on a POS Account condition and may be different from what is provided in this API.",
          "type": "boolean"
        },
        "taxes": {
          "description": "Detailed tax info",
          "items": {
            "$ref": "#/$defs/apeMenuItemTax"
          },
          "type": "array"
        }
      }
    },
    "apeMenuItemEntryV2": {
      "title": "menuItem",
      "allOf": [
        {
          "type": "object",
          "properties": {
            "@type": {
              "type": "string",
              "description": "Indicates this is an individual item.",
              "enum": [
                "menuItem"
              ]
            }
          }
        },
        {
          "$ref": "#/$defs/apeMenuItemEntryParentV2"
        },
        {
          "type": "object",
          "properties": {
            "asSubItem": {
              "type": "boolean",
              "description": "Indicates whether or not this product is a sub-item that cannot be sold alone. Note - when the item is nested under a `menuDeal` this will always be false."
            },
            "productionInstructionList": {
              "type": "array",
              "description": "Array of production instructions for this product",
              "items": {
                "$ref": "#/$defs/apeProductionInstruction"
              }
            },
            "menuModifierGroups": {
              "type": "array",
              "description": "Array of product modifier groups for this product",
              "items": {
                "$ref": "#/$defs/apeMenuModifierGroupV2"
              }
            }
          }
        }
      ]
    },
    "apeMenuItemTax": {
      "type": "object",
      "properties": {
        "description": {
          "type": "string",
          "description": "Tax description as it appears on a POS and receipt."
        },
        "amount": {
          "type": "number",
          "description": "The amount of Tax applied by default by this Tax, this can change dynamically at time of sale."
        },
        "percentage": {
          "type": "number",
          "description": "The percentage of Tax applied by default by this Tax, this can change dynamically at time of sale."
        }
      }
    },
    "apeMenuModifierGroupV2": {
      "type": "object",
      "description": "A product modifier group containing product modifiers to select from.",
      "properties": {
        "description": {
          "type": "string",
          "description": "Description of the modifier group."
        },
        "sku": {
          "type": "string",
          "description": "The SKU of the modifier group."
        },
        "mustSelectAnItem": {
          "type": "boolean",
          "description": "Whether or not this is a required selection."
        },
        "multiSelectionPermitted": {
          "type": "boolean",
          "description": "Whether or not multiple items can be selected from this modifier group."
        },
        "minimumSelection": {
          "type": "integer",
          "format": "int32",
          "description": "The minimum number of items that must be selected from this modifier group. If null then no minimum is set."
        },
        "maximumSelection": {
          "type": "integer",
          "format": "int32",
          "description": "The maximum number of items that can be selected from this modifier group. If null then no maximum is set."
        },
        "itemRichData": {
          "$ref": "#/$defs/apeItemRichData"
        },
        "productModifiers": {
          "description": "Array of product modifiers within this modifier group.",
          "type": "array",
          "items": {
            "$ref": "#/$defs/apeMenuProductModifierEntryV2"
          }
        }
      }
    },
    "apeMenuProductModifierEntryV2": {
      "title": "menuProductModifier",
      "allOf": [
        {
          "type": "object",
          "properties": {
            "@type": {
              "type": "string",
              "description": "Indicates this is a product modifier.",
              "enum": [
                "menuProductModifier"
              ]
            }
          }
        },
        {
          "$ref": "#/$defs/apeMenuItemEntryParentV2"
        },
        {
          "type": "object",
          "properties": {
            "productionInstructionList": {
              "type": "array",
              "description": "Array of production instructions for this modifier",
              "items": {
                "$ref": "#/$defs/apeProductionInstruction"
              }
            }
          }
        }
      ]
    },
    "apeProductionInstruction": {
      "type": "object",
      "properties": {
        "multiSelectionPermitted": {
          "type": "boolean",
          "description": "Specifies if more than one production instruction can be selected for this group."
        },
        "productionInstructionGroupName": {
          "type": "string",
          "description": "The group name for this production instruction."
        },
        "productionIntructionGroupId": {
          "type": "integer",
          "description": "The unique identifier for this production instruction group.",
          "format": "int64"
        },
        "productionInstructionList": {
          "type": "array",
          "description": "Array of production instructions for this group.",
          "items": {
            "$ref": "#/$defs/apeProductionInstructionEntry"
          }
        }
      }
    },
    "apeProductionInstructionEntry": {
      "type": "object",
      "properties": {
        "instruction": {
          "type": "string",
          "description": "The name of the production instruction."
        },
        "ikentooModifierId": {
          "description": "The unique identifier of this production instruction.",
          "type": "integer",
          "format": "int64"
        }
      },
      "description": "Array of production instructions for this group"
    },
    "apeTopLevelMenuGroupEntryV2": {
      "allOf": [
        {
          "type": "object",
          "properties": {
            "@type": {
              "type": "string",
              "description": "Indicates this is a menu group.",
              "enum": [
                "group"
              ]
            },
            "id": {
              "type": "string",
              "description": "The menu group ID."
            },
            "name": {
              "type": "string",
              "description": "The menu group name."
            },
            "color": {
              "type": "string",
              "description": "The color of the button in the POS."
            },
            "menuEntry": {
              "type": "array",
              "description": "Array of menu entry objects.",
              "items": {
                "type": "object",
                "oneOf": [
                  {
                    "$ref": "#/$defs/apeMenuItemEntryV2"
                  },
                  {
                    "$ref": "#/$defs/apeMenuDealEntryV2"
                  },
                  {
                    "$ref": "#/$defs/apeMenuGroupEntryV2"
                  },
                  {
                    "$ref": "#/$defs/apeMenuProductModifierEntryV2"
                  }
                ]
              }
            }
          }
        }
      ]
    }
  }
}