{"openapi":"3.1.0","info":{"version":"v2","title":"Genius for Restaurants API","description":""},"tags":[{"name":"Setup"},{"name":"Menu"},{"name":"Sales"},{"name":"Tickets"},{"name":"Cash"},{"name":"Labor"},{"name":"Orders"},{"name":"Stock"},{"name":"Accounts"},{"name":"Webhook"}],"security":[{"X-Api-Key":[],"Authentication":[]}],"components":{"securitySchemes":{"Authentication":{"description":"Partner Key","in":"header","name":"authentication","type":"apiKey"},"X-Api-Key":{"description":"API key","in":"header","name":"x-Api-Key","type":"apiKey"}},"responses":{"BadRequest":{"description":"Invalid parameters"},"PreconditionFailed":{"description":"Precondition failed."},"Unauthorized":{"description":"Invalid API key"},"Forbidden":{"description":"Forbidden"},"NotFound":{"description":"Not found"},"InternalServerError":{"description":"Internal server error"}},"schemas":{"DeleteResponseType":{"type":"object","properties":{"success":{"description":"Status successful","type":"boolean"}}},"PaginationMetadata":{"type":"object","properties":{"total":{"description":"Total number of items across all pages","type":"integer"},"page":{"description":"Current page number (starts from 1)","type":"integer"},"limit":{"description":"Number of items per page","type":"integer"},"total_pages":{"description":"Total number of pages","type":"integer"}},"required":["total","page","limit","total_pages"]},"UserAccounts":{"type":"object","properties":{"user":{"description":"Data dependent on the type of query parameter.","type":"object"}}},"TimePunch":{"type":"object","properties":{"id":{"description":"Unique ID of the time punch","type":"string"},"staff_id":{"description":"ID of the staff","type":"string"},"job_type_id":{"description":"ID of the staff job type","type":"string"},"punch_in_dt":{"description":"Time punch in date/time","type":"string"},"punch_out_dt":{"description":"Time punch out date/time","type":"string"},"regular_rate":{"description":"Staff regular rate","type":"number","format":"float"},"overtime_rate":{"description":"Staff overtime rate","type":"number","format":"float"},"reported_tips":{"description":"Total tips reported by staff on punch out","type":"number","format":"float"}}},"CreateMenuAttribute":{"type":"object","required":["name"],"properties":{"name":{"description":"Name of attribute","type":"string"},"available_online":{"description":"Available online. Defaults to true when omitted.","type":"boolean","default":true}}},"UpdateMenuAttribute":{"type":"object","properties":{"name":{"description":"Name of attribute","type":"string"}}},"CreateMenuDiscount":{"type":"object","required":["name"],"properties":{"name":{"description":"Name of discount","type":"string"},"tax_exempt":{"description":"Does not increase or reduce the amount of tax collected","type":"boolean"},"open_amount":{"description":"Discount amount is configured at the time it's applied","type":"boolean"},"affect_modifiers":{"description":"Discount will apply to the entire item price, including modifier ingredients","type":"boolean"},"amount":{"description":"Amount of the discount","type":"number","format":"float"},"amount_type":{"description":"Whether the discount amount is a percent or dollar value","type":"string","enum":["percent","dollar"]},"required_items":{"description":"Number of items required need to apply this discount","type":"integer","minimum":0},"required_item_tag_id":{"description":"ID of tag used for requires items (base64 encoded)","type":"string"},"discount_item_tag_id":{"description":"ID of tag used for the discounted item (base64 encoded)","type":"string"}}},"CreateMenuReportCategory":{"type":"object","required":["name"],"properties":{"name":{"description":"Name of report category","type":"string"}}},"UpdateMenuReportCategory":{"type":"object","properties":{"name":{"description":"Name of report category","type":"string"}}},"CreateMenuTag":{"type":"object","required":["name"],"properties":{"name":{"description":"Name of tag","type":"string"}}},"UpdateMenuTag":{"type":"object","properties":{"name":{"description":"Name of tag","type":"string"}}},"CreateMenuTax":{"type":"object","required":["name"],"properties":{"name":{"description":"Name of tax","type":"string"},"rate":{"description":"Percentage rate of the tax","type":"number","format":"float"}}},"PaginatedMenuItemsResponse":{"type":"object","description":"Paginated response format returned when page and limit query parameters are provided","properties":{"data":{"description":"Array of menu items for the current page","type":"array","items":{"$ref":"#/components/schemas/GetMenuItem"}},"pagination":{"$ref":"#/components/schemas/PaginationMetadata"}},"required":["data","pagination"]},"MenuAdjustment":{"type":"object","properties":{"id":{"description":"Unique ID of adjustment","type":"string"},"name":{"description":"Name of adjustment","type":"string"},"default_amount":{"description":"Default adjustment amount","type":"number","format":"float"},"amount_type":{"description":"Whether the adjustment amount is a percent or dollar value","type":"string","enum":["percent","dollar"]},"min_amount":{"description":"Minimum amount the adjustment can be","type":"number","format":"float"},"max_amount":{"description":"Maximum amount the adjustment can be","type":"number","format":"float"},"tax_exempt":{"description":"Does not increase or reduce the amount of tax collected","type":"boolean"},"charge":{"description":"Adjustment is an added charge instead of a discount","type":"boolean"},"service_charge":{"description":"Adjustment is a gratuity paid out to the staff","type":"boolean"},"non_revenue":{"description":"Adjustment is non-revenue for reporting","type":"boolean"},"auto_apply":{"description":"Automatically applied to ticket","type":"string"},"auto_apply_party_size":{"description":"Automatically applied based on guest count","type":"integer"},"room_specific":{"description":"Adjustment is scoped to specific rooms or is available globally","type":"boolean"}}},"CreateMenuAdjustment":{"type":"object","required":["name"],"properties":{"name":{"description":"Name of adjustment","type":"string"},"default_amount":{"description":"Default adjustment amount","type":"number","format":"float"},"amount_type":{"description":"Whether the adjustment amount is a percent or dollar value","type":"string","enum":["percent","dollar"]},"min_amount":{"description":"Minimum amount the adjustment can be","type":"number","format":"float"},"max_amount":{"description":"Maximum amount the adjustment can be","type":"number","format":"float"},"tax_exempt":{"description":"Does not increase or reduce the amount of tax collected","type":"boolean"},"charge":{"description":"Adjustment is an added charge instead of a discount","type":"boolean"},"service_charge":{"description":"Adjustment is a gratuity paid out to the staff","type":"boolean"},"non_revenue":{"description":"Adjustment is non-revenue for reporting","type":"boolean"},"auto_apply":{"description":"Automatically applied to ticket","type":"boolean"},"auto_apply_party_size":{"description":"Automatically applied based on guest count","type":"integer"},"room_specific":{"description":"Adjustment is scoped to specific rooms or is available globally","type":"boolean"}}},"UpdateMenuAdjustment":{"type":"object","properties":{"name":{"description":"Name of adjustment","type":"string"},"default_amount":{"description":"Default adjustment amount","type":"number","format":"float"},"amount_type":{"description":"Whether the adjustment amount is a percent or dollar value","type":"string","enum":["percent","dollar"]},"min_amount":{"description":"Minimum amount the adjustment can be","type":"number","format":"float"},"max_amount":{"description":"Maximum amount the adjustment can be","type":"number","format":"float"},"tax_exempt":{"description":"Does not increase or reduce the amount of tax collected","type":"boolean"},"charge":{"description":"Adjustment is an added charge instead of a discount","type":"boolean"},"service_charge":{"description":"Adjustment is a gratuity paid out to the staff","type":"boolean"},"non_revenue":{"description":"Adjustment is non-revenue for reporting","type":"boolean"},"auto_apply":{"description":"Automatically applied to ticket","type":"boolean"},"auto_apply_party_size":{"description":"Automatically applied based on guest count","type":"integer"},"room_specific":{"description":"Adjustment is scoped to specific rooms or is available globally","type":"boolean"}}},"PatchMenuAdjustment":{"type":"object","description":"Partial update for an adjustment. All fields are optional.","properties":{"name":{"description":"Name of adjustment","type":"string"},"default_amount":{"description":"Default adjustment amount","type":"number","format":"float"},"min_amount":{"description":"Minimum amount the adjustment can be","type":"number","format":"float"},"max_amount":{"description":"Maximum amount the adjustment can be","type":"number","format":"float"},"tax_exempt":{"description":"Does not increase or reduce the amount of tax collected","type":"boolean"},"charge":{"description":"Adjustment is an added charge instead of a discount","type":"boolean"},"service_charge":{"description":"Adjustment is a gratuity paid out to the staff","type":"boolean"},"non_revenue":{"description":"Adjustment is non-revenue for reporting","type":"boolean"},"auto_apply":{"description":"Automatically applied to ticket","type":"boolean"},"auto_apply_party_size":{"description":"Automatically applied based on guest count","type":"integer"},"amount_type":{"description":"Whether the adjustment amount is a percent or dollar value","type":"string","enum":["percent","dollar"]},"room_specific":{"description":"Adjustment is scoped to specific rooms or is available globally","type":"boolean"}}},"PutMenuAdjustment":{"type":"object","description":"PUT payload for an adjustment. `name` is required. All other fields are optional and default to their initial values when omitted.","required":["name"],"properties":{"name":{"description":"Name of adjustment","type":"string","minLength":1},"default_amount":{"description":"Default adjustment amount. Defaults to 0 if omitted.","type":"number","format":"float","minimum":0,"default":0},"amount_type":{"description":"Whether the adjustment amount is a percent or dollar value. Defaults to `percent` if omitted.","type":"string","enum":["percent","dollar"],"default":"percent"},"min_amount":{"description":"Minimum amount the adjustment can be. Defaults to 0 if omitted. Must be ≤ max_amount.","type":"number","format":"float","minimum":0,"default":0},"max_amount":{"description":"Maximum amount the adjustment can be. Defaults to 0 if omitted. Must be ≥ min_amount.","type":"number","format":"float","minimum":0,"default":0},"tax_exempt":{"description":"Does not increase or reduce the amount of tax collected. Defaults to false if omitted.","type":"boolean","default":false},"charge":{"description":"Adjustment is an added charge instead of a discount. Defaults to false if omitted.","type":"boolean","default":false},"service_charge":{"description":"Adjustment is a gratuity paid out to the staff. Defaults to false if omitted.","type":"boolean","default":false},"non_revenue":{"description":"Adjustment is non-revenue for reporting. Defaults to false if omitted.","type":"boolean","default":false},"auto_apply":{"description":"Automatically applied to ticket. Defaults to false if omitted.","type":"boolean","default":false},"auto_apply_party_size":{"description":"Guest count threshold for auto-apply. Only used when `auto_apply` is true; ignored otherwise (stored as -1). Must be an integer ≥ 0. Defaults to 0 if omitted and `auto_apply` is true.","type":"integer","minimum":0},"room_specific":{"description":"Adjustment is scoped to specific rooms or is available globally. Defaults to false if omitted.","type":"boolean","default":false}}},"PutMenuAdjustmentResponse":{"type":"object","description":"Response body for PUT /v2/menu/adjustments/{id}. Contains all adjustment fields including amount_type and room_specific.","properties":{"id":{"description":"Unique ID of adjustment","type":"string"},"name":{"description":"Name of adjustment","type":"string"},"default_amount":{"description":"Default adjustment amount","type":"number","format":"float"},"amount_type":{"description":"Whether the adjustment amount is a percent or dollar value","type":"string","enum":["percent","dollar"]},"min_amount":{"description":"Minimum amount the adjustment can be","type":"number","format":"float"},"max_amount":{"description":"Maximum amount the adjustment can be","type":"number","format":"float"},"tax_exempt":{"description":"Does not increase or reduce the amount of tax collected","type":"boolean"},"charge":{"description":"Adjustment is an added charge instead of a discount","type":"boolean"},"service_charge":{"description":"Adjustment is a gratuity paid out to the staff","type":"boolean"},"non_revenue":{"description":"Adjustment is non-revenue for reporting","type":"boolean"},"auto_apply":{"description":"Automatically applied to ticket","type":"boolean"},"auto_apply_party_size":{"description":"Automatically applied based on guest count","type":"integer"},"room_specific":{"description":"Adjustment is scoped to specific rooms or is available globally","type":"boolean"}}},"MenuAttribute":{"type":"object","properties":{"id":{"description":"Unique ID of attribute","type":"string"},"name":{"description":"Name of attribute","type":"string"},"available_online":{"description":"Available online","type":"boolean"}}},"PatchMenuAttribute":{"type":"object","description":"PATCH payload for an attribute. All fields are optional; omitted fields remain unchanged.","properties":{"name":{"description":"Name of the attribute. When omitted, current value is unchanged.","type":"string","minLength":1},"available_online":{"description":"Whether the attribute is available online. When omitted, current value is unchanged.","type":"boolean"}},"additionalProperties":false},"PutMenuAttribute":{"type":"object","description":"PUT payload for an attribute. `name` is required; `available_online` defaults to `true` if omitted.","required":["name"],"properties":{"name":{"description":"Name of attribute","type":"string","minLength":1},"available_online":{"description":"Whether the attribute is available online. Defaults to `true` when omitted.","type":"boolean"}},"additionalProperties":false},"MenuContextItem":{"type":"object","properties":{"id":{"description":"Unique ID of context item","type":"string"},"name":{"description":"Name of context item","type":"string"},"short_name":{"description":"Short name of context item","type":"string"},"ingredients":{"description":"List of ingredients applied to this context item","type":"array","items":{"properties":{"ingredient_id":{"description":"ID of ingredient","type":"string"},"multiplier":{"description":"Multiplier of ingredient","type":"number","format":"float"}}}},"available_online":{"description":"Available online","type":"boolean"}}},"CreateMenuContextItem":{"type":"object","required":["name"],"properties":{"name":{"description":"Name of context item","type":"string"},"short_name":{"description":"Short name of context item","type":"string"},"ingredients":{"description":"List of ingredients to assign to this context item. When omitted, no ingredients are assigned.","type":"array","items":{"type":"object","required":["ingredient_id"],"properties":{"ingredient_id":{"description":"ID of the ingredient","type":"string"},"multiplier":{"description":"Multiplier of the ingredient. Defaults to 1.0 if omitted.","type":"number","format":"float","default":1}}}},"available_online":{"description":"Available online","type":"boolean"}}},"PatchMenuContextItem":{"type":"object","properties":{"name":{"description":"Display name of the context item. When omitted, current value is unchanged.","type":"string"},"short_name":{"description":"Short reference / abbreviation. When omitted, current value is unchanged.","type":"string"},"available_online":{"description":"Whether the context item is available online. When omitted, current value is unchanged.","type":"boolean"},"ingredients":{"description":"List of ingredients to assign to this context item. When present, fully replaces the existing ingredient list. When present but empty, removes all existing ingredient assignments. When omitted, existing ingredient assignments remain unchanged.","type":"array","items":{"type":"object","required":["ingredient_id"],"properties":{"ingredient_id":{"description":"ID of the ingredient","type":"string"},"multiplier":{"description":"Multiplier of the ingredient. Defaults to 1.0 if omitted.","type":"number","format":"float","default":1}}}}}},"PutMenuContextItem":{"type":"object","required":["name"],"properties":{"name":{"description":"Display name of the context item.","type":"string"},"short_name":{"description":"Short reference / abbreviation. Defaults to \"\" if omitted.","type":"string","default":""},"ingredients":{"description":"List of ingredients to assign to this context item. Fully replaces the existing ingredient list. Defaults to [] if omitted.","type":"array","default":[],"items":{"type":"object","required":["ingredient_id"],"properties":{"ingredient_id":{"description":"ID of the ingredient","type":"string"},"multiplier":{"description":"Multiplier of the ingredient. Defaults to 1.0 if omitted.","type":"number","format":"float","default":1}}}},"available_online":{"description":"Whether the context item is available online. Defaults to true if omitted.","type":"boolean","default":true}}},"PutMenuContextItemResponse":{"type":"object","properties":{"id":{"description":"Unique ID of the context item","type":"string"},"name":{"description":"Display name of the context item","type":"string"},"short_name":{"description":"Short reference / abbreviation","type":"string"},"ingredients":{"description":"List of ingredients assigned to this context item","type":"array","items":{"type":"object","properties":{"ingredient_id":{"description":"ID of the ingredient","type":"string"},"multiplier":{"description":"Multiplier of the ingredient","type":"number","format":"float"}}}},"available_online":{"description":"Whether the context item is available online","type":"boolean"}}},"CreateMenuPromo":{"type":"object","required":["name","promo_code"],"properties":{"name":{"description":"Name of promotion","type":"string"},"promo_code":{"description":"The code entered at the POS to activate this promotion","type":"string"},"discount_id":{"description":"Base64-encoded item-level discount graph ID (a record from GET /v2/menu/discounts), e.g. `discount:<numeric>`. Supply exactly one of `discount_id` or `adjustment_id`.","type":"string"},"adjustment_id":{"description":"Base64-encoded ticket-level adjustment graph ID (a record from GET /v2/menu/adjustments), e.g. `adjustment:<numeric>`. Supply exactly one of `discount_id` or `adjustment_id`.","type":"string"},"available_online":{"description":"Whether this promo code can be applied on online orders. Defaults to true when omitted.","type":"boolean"},"available_kiosk":{"description":"Whether this promo code can be applied on kiosk orders. Defaults to true when omitted.","type":"boolean"}}},"MenuPromo":{"type":"object","properties":{"id":{"description":"Unique ID of promotion (base64 encoded)","type":"string"},"name":{"description":"Name of promotion","type":"string"},"promo_code":{"description":"The code entered at the POS to activate this promotion","type":"string"},"type":{"description":"Read-only convenience field indicating which parent ID is populated: 'discount' when discount_id is populated (item-level promo), 'adjustment' when adjustment_id is populated (ticket-level promo). Derived server-side; not supplied on write.","type":"string","enum":["discount","adjustment"]},"discount_id":{"description":"The linked item-level discount (a record from GET /v2/menu/discounts). Populated when this is an item-level promo, null otherwise. Exactly one of discount_id or adjustment_id is populated per record.","type":"string","nullable":true},"adjustment_id":{"description":"The linked ticket-level adjustment (a record from GET /v2/menu/adjustments). Populated when this is a ticket-level promo, null otherwise. Exactly one of discount_id or adjustment_id is populated per record.","type":"string","nullable":true},"available_online":{"description":"Whether this promo code can be applied on online orders","type":"boolean"},"available_kiosk":{"description":"Whether this promo code can be applied on kiosk orders","type":"boolean"}}},"PatchMenuPromo":{"type":"object","description":"Partial promo update. All fields optional; omitted fields unchanged. Supply at most one of `discount_id` or `adjustment_id`.","additionalProperties":false,"properties":{"name":{"description":"Name of promotion","type":"string","minLength":1},"promo_code":{"description":"The code entered at the POS to activate this promotion","type":"string","minLength":1},"discount_id":{"description":"Base64-encoded item-level discount ID. Mutually exclusive with `adjustment_id`.","type":"string"},"adjustment_id":{"description":"Base64-encoded ticket-level adjustment ID. Mutually exclusive with `discount_id`.","type":"string"},"available_online":{"description":"Available for online orders","type":"boolean"},"available_kiosk":{"description":"Available for kiosk orders","type":"boolean"}}},"MenuDiscount":{"type":"object","properties":{"id":{"description":"Unique ID of discount","type":"string"},"name":{"description":"Name of discount","type":"string"},"tax_exempt":{"description":"Does not increase or reduce the amount of tax collected","type":"boolean"},"open_amount":{"description":"Discount amount is configured at the time it's applied","type":"boolean"},"affect_modifiers":{"description":"Discount will apply to the entire item price, including modifier ingredients","type":"boolean"},"amount":{"description":"Amount of the discount","type":"number","format":"float"},"amount_type":{"description":"Whether the discount amount is a percent or dollar value","type":"string","enum":["percent","dollar"]},"required_items":{"description":"Number of items required need to apply this discount","type":"integer","minimum":0},"required_item_tag_id":{"description":"ID of tag used for requires items (base64 encoded)","type":"string"},"discount_item_tag_id":{"description":"ID of tag used for the discounted item (base64 encoded)","type":"string"}}},"PostMenuDiscount":{"type":"object","properties":{"id":{"description":"Unique ID of discount","type":"string"},"name":{"description":"Name of discount","type":"string"},"tax_exempt":{"description":"Does not increase or reduce the amount of tax collected","type":"boolean"},"open_amount":{"description":"Discount amount is configured at the time it's applied","type":"boolean"},"affect_modifiers":{"description":"Discount will apply to the entire item price, including modifier ingredients","type":"boolean"},"amount":{"description":"Amount of the discount","type":"number","format":"float"},"amount_type":{"description":"Whether the discount amount is a percent or dollar value","type":"string","enum":["percent","dollar"]},"required_items":{"description":"Number of items required need to apply this discount","type":"integer","minimum":0},"required_item_tag_id":{"description":"ID of tag used for requires items (base64 encoded)","type":"string"},"discount_item_tag_id":{"description":"ID of tag used for the discounted item (base64 encoded)","type":"string"}}},"PatchMenuDiscount":{"type":"object","properties":{"name":{"description":"Name of discount","type":"string"},"tax_exempt":{"description":"Does not increase or reduce the amount of tax collected","type":"boolean"},"open_amount":{"description":"Discount amount is configured at the time it's applied","type":"boolean"},"affect_modifiers":{"description":"Discount will apply to the entire item price, including modifier ingredients","type":"boolean"},"amount":{"description":"Amount of the discount","type":"number","format":"float"},"amount_type":{"description":"Whether the discount amount is a percent or dollar value","type":"string","enum":["percent","dollar"]},"required_items":{"description":"Number of items required need to apply this discount","type":"integer","minimum":0},"required_item_tag_id":{"description":"ID of tag used for requires items (base64 encoded)","type":"string"},"discount_item_tag_id":{"description":"ID of tag used for the discounted item (base64 encoded)","type":"string"}}},"PutMenuDiscount":{"type":"object","description":"PUT payload for a discount. `name` is required. All other fields are optional and defaulted when omitted.","required":["name"],"properties":{"name":{"description":"Name of discount","type":"string"},"tax_exempt":{"description":"Does not increase or reduce the amount of tax collected. Defaults to false.","type":"boolean","default":false},"open_amount":{"description":"Discount amount is configured at the time it's applied. Defaults to false.","type":"boolean","default":false},"affect_modifiers":{"description":"Discount applies to the entire item price including modifier ingredients. Defaults to false.","type":"boolean","default":false},"amount":{"description":"Amount of the discount. Defaults to 0.","type":"number","format":"float","minimum":0,"default":0},"amount_type":{"description":"Whether the discount amount is percent or dollar. Defaults to percent.","type":"string","enum":["percent","dollar"],"default":"percent"},"required_items":{"description":"Number of items required need to apply this discount","type":"integer","minimum":0,"default":0},"required_item_tag_id":{"description":"ID of tag used for requires items (base64 encoded). When omitted on PUT, this field resets to no tag(\"\")","type":"string"},"discount_item_tag_id":{"description":"ID of tag used for the discounted item (base64 encoded). When omitted on PUT, this field resets to no tag(\"\")","type":"string"}}},"MenuGroup":{"type":"object","properties":{"id":{"description":"Unique ID of group","type":"string"},"name":{"description":"Name of group","type":"string"},"sections":{"description":"List of sections applied to this group","type":"array","items":{"properties":{"section_id":{"description":"ID of section","type":"string"},"sort_order":{"description":"Indicates the display position of that section within the group","type":"integer"}}}},"available_online":{"description":"Whether the group is available for online ordering","type":"boolean"}}},"CreateMenuGroup":{"type":"object","required":["name","available_online"],"properties":{"name":{"description":"Name of group","type":"string"},"sections":{"description":"List of sections applied to this group","type":"array","items":{"properties":{"section_id":{"description":"ID of section","type":"string"}}}},"available_online":{"description":"Available online","type":"boolean"}}},"ReturnCreateMenuGroup":{"type":"object","properties":{"id":{"description":"Unique ID of group","type":"string"},"name":{"description":"Name of group","type":"string"},"sections":{"description":"List of sections applied to this group","type":"array","items":{"properties":{"section_id":{"description":"ID of section","type":"string"}}}},"available_online":{"description":"Available online","type":"boolean"}}},"PatchMenuGroup":{"type":"object","description":"Partial update payload for a menu group. All fields are optional.","properties":{"name":{"description":"Name of group","type":"string"},"sections":{"description":"List of sections applied to this group","type":"array","items":{"properties":{"section_id":{"description":"ID of section","type":"string"}}}},"available_online":{"description":"Available online","type":"boolean"}}},"PutMenuGroup":{"type":"object","description":"Full replacement payload for a menu group. `name` is required; omitted fields reset to defaults.","required":["name"],"properties":{"name":{"description":"Name of group","type":"string"},"sections":{"description":"List of sections applied to this group. Defaults to `[]` if omitted.","type":"array","default":[],"items":{"properties":{"section_id":{"description":"ID of section","type":"string"}}}},"available_online":{"description":"Available online. Defaults to `true` if omitted.","type":"boolean","default":true}}},"PutMenuGroupResponse":{"type":"object","properties":{"id":{"description":"Unique ID of group","type":"string"},"name":{"description":"Name of group","type":"string"},"sections":{"description":"List of sections applied to this group","type":"array","items":{"properties":{"section_id":{"description":"ID of section","type":"string"}}}},"available_online":{"description":"Available online","type":"boolean"}}},"GetMenuIngredient":{"type":"object","properties":{"id":{"description":"Unique ID of ingredient","type":"string"},"name":{"description":"Name of ingredient","type":"string"},"short_name":{"description":"Short name of ingredient","type":"string"},"available_online":{"description":"Available online","type":"boolean"},"stock":{"description":"In stock or out of stock, signified by either -1 or 0, respectively.","type":"number","format":"integer"},"subitem_id":{"description":"subitem_id","type":"string"},"misc_ingredient":{"description":"Allows the price of the ingredient to be changed as needed within the POS","type":"boolean"},"context_items":{"description":"List of related context items and multipliers","type":"array","items":{"type":"object","properties":{"context_item_id":{"description":"ID of context item","type":"string"},"multiplier":{"description":"Multiplier applied to ingredient in the context item","type":"number","format":"float"}}}}}},"MenuIngredient":{"type":"object","properties":{"id":{"description":"Unique ID of ingredient","type":"string"},"name":{"description":"Name of ingredient","type":"string"},"short_name":{"description":"Short name of ingredient","type":"string"},"available_online":{"description":"Available online","type":"boolean"},"stock":{"description":"In stock or out of stock, signified by either -1 or 0, respectively.","type":"number","format":"integer"},"subitem_id":{"description":"subitem_id","type":"string"},"context_items":{"description":"List of related context items and multipliers","type":"array","items":{"type":"object","properties":{"context_item_id":{"description":"ID of context item","type":"string"},"multiplier":{"description":"Multiplier applied to ingredient in the context item","type":"number","format":"float"}}}}}},"CreateMenuIngredient":{"type":"object","required":["name","available_online","stock"],"properties":{"name":{"description":"Name of ingredient","type":"string"},"short_name":{"description":"Short name of ingredient","type":"string"},"available_online":{"description":"Available online","type":"boolean"},"stock":{"description":"In stock or out of stock, signified by either -1 or 0, respectively.","type":"number","format":"integer"},"subitem_id":{"description":"subitem_id of ingredient","type":"string"},"context_items":{"description":"List of context item associations. Mutually exclusive with subitem_id.","type":"array","items":{"type":"object","required":["context_item_id"],"properties":{"context_item_id":{"type":"string","description":"Base64-encoded context item ID."},"multiplier":{"type":"number","description":"Multiplier (defaults to 1.0 if omitted).","default":1}}}}}},"PutMenuIngredient":{"type":"object","required":["name"],"properties":{"name":{"description":"Name of ingredient","type":"string","minLength":1},"short_name":{"description":"Short name of ingredient. Defaults to \"\" if omitted.","type":"string","default":""},"available_online":{"description":"Available online. Defaults to true if omitted.","type":"boolean","default":true},"stock":{"description":"Stock quantity (-1 = untracked, >= 0 = tracked count). Defaults to -1 if omitted.","type":"integer","minimum":-1,"default":-1},"subitem_id":{"description":"Base64-encoded subitem ID. Format: `item:<numeric_id>`. Pass \"\" or omit to clear. Defaults to \"\" if omitted.","type":"string","default":""},"context_items":{"description":"List of context item associations. Provide empty array or omit to clear. Defaults to [] if omitted.","type":"array","default":[],"items":{"type":"object","required":["context_item_id","multiplier"],"properties":{"context_item_id":{"description":"Base64-encoded context item ID. Format: `contextItem:<numeric_id>`","type":"string"},"multiplier":{"description":"Multiplier applied to ingredient in this context","type":"number"}}}}}},"PatchMenuIngredient":{"type":"object","properties":{"name":{"description":"Name of ingredient","type":"string"},"short_name":{"description":"Short name of ingredient","type":"string"},"available_online":{"description":"Available online","type":"boolean"},"stock":{"description":"Stock quantity (-1 = untracked, >= 0 = tracked count)","type":"number","format":"integer","minimum":-1},"subitem_id":{"description":"Base64-encoded subitem ID. Must reference a valid subitem entity.","type":"string"},"context_items":{"description":"List of context item associations. Omit to leave unchanged; provide empty array to remove all; provide non-empty array to fully replace.","type":"array","items":{"type":"object","required":["context_item_id","multiplier"],"properties":{"context_item_id":{"description":"Base64-encoded context item ID","type":"string"},"multiplier":{"description":"Multiplier applied to ingredient in this context","type":"number"}}}}}},"GetMenuItem":{"type":"object","properties":{"id":{"description":"Unique ID of item","type":"string"},"name":{"description":"Name of item","type":"string"},"short_name":{"description":"Short name of item","type":"string"},"image_URL":{"description":"URL of the image","type":["string","null"],"example":"https://cdn.hrpos.heartland.us/items/cheeseburger.jpg"},"description":{"description":"Description of the item","type":["string","null"]},"sku":{"description":"SKU used for scanning","type":["string","null"]},"price":{"description":"Price of the item","type":"number","format":"float"},"cost":{"description":"Food cost of the item","type":"number","format":"float"},"stock":{"description":"Stock of the item","type":"number","format":"integer"},"tax_type":{"description":"How to calculate tax for this item","type":"string","enum":["taxable","tax_inclusive","tax_exempt"],"example":"taxable"},"non_revenue":{"description":"Item is non-revenue for reporting","type":"boolean"},"measurement_type":{"description":"If weighted, how to measure the weight for this item","type":"string","enum":["per_unit","per_kilogram","per_ounce","per_pound","not_measured","per_minute"],"example":"per_unit"},"tare":{"description":"Tare applied for this item","type":"number","format":"float","minimum":0},"decimal_places":{"description":"Decimal places applied for this item","type":"integer","enum":[0,1,2]},"default_course":{"description":"Default course applied for this item","type":"integer"},"prevent_discounts":{"description":"Item is not allowed to be discounted","type":"boolean"},"misc_item":{"description":"Allows the price of the item to be changed as needed within the POS","type":"boolean"},"hide_on_receipt":{"description":"If price is 0, hide item on the customer receipt","type":"boolean"},"gift_card":{"description":"Item sold as a gift card","type":"boolean"},"tippable":{"description":"Item sales will contribute to service charges, auto-gratuities, and suggested tips","type":"boolean"},"separate_seats":{"description":"Item will be added with a unique seat number","type":"boolean"},"half_pricing":{"description":"Determines how ingredients are priced for half & half modifiers","type":"string","enum":["none","most_expensive","step"],"example":"most_expensive"},"report_category_id":{"description":"ID of assigned report category","type":"string"},"kitchen_group_id":{"description":"ID of assigned kitchen group","type":"string"},"sizes":{"description":"List of assigned sizes","type":"array","items":{"properties":{"item_size_id":{"description":"ID of the size instance on this specific item. The same 'Size' on a different item with share a size_id, but have different item_size_id values.","type":"string"},"size_id":{"description":"ID of assigned size","type":"string"},"price":{"description":"Price of the item size","type":"number","format":"float"},"cost":{"description":"Food cost of the item size","type":"number","format":"float"},"sort_order":{"description":"The order of sizes under the item.","type":"integer"},"is_default":{"description":"Whether this size is the item's default size. Exactly one size is true when a default is configured; all false otherwise. Read-only, derived from POS configuration.","type":"boolean"}}}},"tags":{"description":"List of assigned tags","type":"array","items":{"properties":{"tag_id":{"description":"ID of assigned tag","type":"string"}}}},"attributes":{"description":"List of assigned attributes","type":"array","items":{"properties":{"attribute_id":{"description":"ID of assigned attribute","type":"string"}}}},"modifiers":{"description":"List of assigned modifiers","type":"array","items":{"properties":{"modifier_id":{"description":"ID of assigned modifier","type":"string"},"default_ingredients":{"description":"List of ingredients added by default for this item","type":"array","items":{"properties":{"ingredient_id":{"description":"ID of ingredient","type":"string"}}}},"sort_order":{"description":"The order of modifiers under the item.","type":"integer"}}}},"available_online":{"description":"Whether the item is available for online ordering","type":"boolean"},"alcohol":{"description":"Indicates if item is flagged as an alcohol purchase","type":"boolean"},"button_color":{"description":"Button color for the item","type":"string"}}},"MenuItem":{"type":"object","properties":{"id":{"description":"Unique ID of item","type":"string"},"name":{"description":"Name of item","type":"string"},"short_name":{"description":"Short name of item","type":"string"},"image_URL":{"description":"URL of the image","type":["string","null"],"example":"https://cdn.hrpos.heartland.us/items/cheeseburger.jpg"},"description":{"description":"Description of the item","type":["string","null"]},"sku":{"description":"SKU used for scanning","type":["string","null"]},"price":{"description":"Price of the item","type":"number","format":"float"},"cost":{"description":"Food cost of the item","type":"number","format":"float"},"stock":{"description":"Stock of the item","type":"number","format":"integer"},"tax_type":{"description":"How to calculate tax for this item","type":"string","enum":["taxable","tax_inclusive","tax_exempt"],"example":"taxable"},"non_revenue":{"description":"Item is non-revenue for reporting","type":"boolean"},"measurement_type":{"description":"If weighted, how to measure the weight for this item","type":"string","enum":["per_unit","per_kilogram","per_ounce","per_pound","not_measured","per_minute"],"example":"per_unit"},"default_course":{"description":"Default course applied for this item","type":"integer"},"prevent_discounts":{"description":"Item is not allowed to be discounted","type":"boolean"},"misc_item":{"description":"Allows the price of the item to be changed as needed within the POS","type":"boolean"},"hide_on_receipt":{"description":"If price is 0, hide item on the customer receipt","type":"boolean"},"gift_card":{"description":"Item sold as a gift card","type":"boolean"},"tippable":{"description":"Item sales will contribute to service charges, auto-gratuities, and suggested tips","type":"boolean"},"separate_seats":{"description":"Item will be added with a unique seat number","type":"boolean"},"half_pricing":{"description":"Determines how ingredients are priced for half & half modifiers","type":"string","enum":["none","most_expensive","step"],"example":"most_expensive"},"report_category_id":{"description":"ID of assigned report category","type":"string"},"kitchen_group_id":{"description":"ID of assigned kitchen group","type":"string"},"sizes":{"description":"List of assigned sizes","type":"array","items":{"properties":{"item_size_id":{"description":"ID of the size instance on this specific item. The same 'Size' on a different item with share a size_id, but have different item_size_id values.","type":"string"},"size_id":{"description":"ID of assigned size","type":"string"},"price":{"description":"Price of the item size","type":"number","format":"float"},"cost":{"description":"Food cost of the item size","type":"number","format":"float"},"sort_order":{"description":"The order of sizes under the item.","type":"integer"},"is_default":{"description":"Whether this size is the item's default size. Exactly one size is true when a default is configured; all false otherwise. Read-only, derived from POS configuration.","type":"boolean"}}}},"tags":{"description":"List of assigned tags","type":"array","items":{"properties":{"tag_id":{"description":"ID of assigned tag","type":"string"}}}},"attributes":{"description":"List of assigned attributes","type":"array","items":{"properties":{"attribute_id":{"description":"ID of assigned attribute","type":"string"}}}},"modifiers":{"description":"List of assigned modifiers","type":"array","items":{"properties":{"modifier_id":{"description":"ID of assigned modifier","type":"string"},"default_ingredients":{"description":"List of ingredients added by default for this item","type":"array","items":{"properties":{"ingredient_id":{"description":"ID of ingredient","type":"string"}}}},"sort_order":{"description":"The order of modifiers under the item.","type":"integer"}}}},"available_online":{"description":"Whether the item is available for online ordering","type":"boolean"},"alcohol":{"description":"Indicates if item is flagged as an alcohol purchase","type":"boolean"},"button_color":{"description":"Button color for the item","type":"string"}}},"MenuItemUpdate":{"type":"object","properties":{"description":{"description":"Description of the item","type":"string","example":"A mouth watering description of an item."},"price":{"description":"Price of the item","type":"number","format":"float","example":"10"}}},"MenuItemCreate":{"type":"object","required":["name","price","stock","tax_type","available_online"],"properties":{"name":{"type":"string","description":"Name of the item","example":"Cheeseburger"},"short_name":{"type":"string","description":"Short name of the item","example":"CBG"},"description":{"type":"string","description":"Description of the item","example":"A delicious cheeseburger with melted cheese"},"sku":{"type":"string","description":"Stock Keeping Unit identifier","example":"ITEM-0001"},"price":{"type":"number","format":"float","description":"Price of the item","example":10},"cost":{"type":"number","format":"float","description":"Cost of the item","example":6.5},"stock":{"type":"integer","description":"Stock quantity (-1 means unlimited)","example":100},"tax_type":{"type":"string","enum":["taxable","tax_exempt","tax_inclusive"],"description":"Tax type of the item","example":"taxable"},"non_revenue":{"type":"boolean","description":"Whether the item generates revenue","example":false},"measurement_type":{"type":"string","enum":["not_measured","per_unit","per_pound","per_ounce","per_minute","per_kilogram"],"description":"Measurement type","example":"per_unit"},"tare":{"description":"tare for applied this item","type":"integer","format":"float"},"decimal_places":{"description":"Decimal Places applied for this item","type":"integer","enum":[0,1,2]},"default_course":{"type":"integer","description":"Default course number","example":2},"prevent_discounts":{"type":"boolean","description":"Whether discounts are prevented for this item","example":true},"misc_item":{"type":"boolean","description":"Whether the item is a miscellaneous item","example":false},"hide_on_receipt":{"type":"boolean","description":"Whether to hide the item on receipt","example":false},"gift_card":{"type":"boolean","description":"Whether the item is a gift card","example":false},"tippable":{"type":"boolean","description":"Whether the item is eligible for tips","example":true},"separate_seats":{"type":"boolean","description":"Whether the item should be separated by seat","example":false},"half_pricing":{"type":"string","enum":["none","most_expensive","step"],"description":"Half pricing rule: 'most_expensive' and 'step' are valid strings. Invalid strings are treated as 'None'","example":"most_expensive"},"report_category_id":{"type":"string","description":"Report category ID (base64 encoded)","example":"UmVwb3J0Q2F0ZWdvcnkx"},"kitchen_group_id":{"type":"string","description":"Kitchen group ID (base64 encoded)","example":"S2l0Y2hlbkdwMDE="},"available_online":{"type":"boolean","description":"Whether the item is available for online orders","example":true},"alcohol":{"type":"boolean","description":"Whether the item contains alcohol","example":false},"sizes":{"type":"array","description":"Available sizes (size_id must be unique; at most one size may have is_default set to true)","items":{"type":"object","required":["size_id","price"],"properties":{"size_id":{"type":"string","description":"Size ID (base64 encoded)","example":"U0laRTAx"},"price":{"type":"number","description":"Price for this size","example":12.99},"cost":{"type":"number","description":"Cost for this size","example":8},"is_default":{"type":"boolean","description":"Whether this size is the item's default size. At most one size can be true; defaults to false if omitted.","default":false,"example":true}}}},"tags":{"type":"array","description":"Tags applied to the item (tag_id must be unique)","items":{"type":"object","required":["tag_id"],"properties":{"tag_id":{"type":"string","description":"Tag ID (base64 encoded)","example":"VEFHMDI="}}}},"modifiers":{"type":"array","description":"Modifiers applied to the item (modifier_id must be unique)","items":{"type":"object","required":["modifier_id"],"properties":{"modifier_id":{"type":"string","description":"Modifier ID (base64 encoded)","example":"TW9kaWZpZXIwMQ=="},"excluded_online_item":{"type":"boolean","description":"Whether to exclude this modifier from online orders","example":false},"default_ingredients":{"type":"array","description":"Default ingredients for the modifier (ingredient_id must be unique)","items":{"type":"object","required":["ingredient_id"],"properties":{"ingredient_id":{"type":"string","description":"Ingredient ID (base64 encoded)","example":"SU5HUjAx"}}}},"excluded_online_ingredients":{"type":"array","description":"Ingredients to exclude in online orders (ingredient_id must be unique)","items":{"type":"object","required":["ingredient_id"],"properties":{"ingredient_id":{"type":"string","description":"Ingredient ID (base64 encoded)","example":"SU5HUjAy"}}}}}}},"button_color":{"type":"string","description":"Button color for the item","example":"#FF5733"}}},"PatchMenuItem":{"type":"object","description":"Partial update for a menu item. All fields are optional, but at least one field is required.","properties":{"name":{"type":"string","description":"Name of the item","example":"Cheeseburger"},"short_name":{"type":"string","description":"Short name of the item","example":"CBG"},"description":{"type":"string","description":"Description of the item","example":"A delicious cheeseburger with melted cheese"},"sku":{"type":"string","description":"Stock Keeping Unit identifier","example":"ITEM-0001"},"price":{"type":"number","format":"float","description":"Price of the item","minimum":0,"example":10},"cost":{"type":"number","format":"float","description":"Cost of the item","minimum":0,"example":6.5},"stock":{"type":"integer","description":"Stock quantity (-1 means unlimited)","minimum":-1,"example":100},"tax_type":{"type":"string","enum":["taxable","tax_exempt","tax_inclusive"],"description":"Tax type of the item","example":"taxable"},"non_revenue":{"type":"boolean","description":"Whether the item generates revenue","example":false},"measurement_type":{"type":"string","enum":["not_measured","per_unit","per_pound","per_ounce","per_minute","per_kilogram"],"description":"Measurement type","example":"per_unit"},"tare":{"description":"Tare applied for this item","type":"number","format":"float","minimum":0},"decimal_places":{"description":"Decimal places applied for this item","type":"integer","enum":[0,1,2]},"default_course":{"type":"integer","description":"Default course number","minimum":0,"example":2},"prevent_discounts":{"type":"boolean","description":"Whether discounts are prevented for this item","example":true},"misc_item":{"type":"boolean","description":"Whether the item is a miscellaneous item","example":false},"hide_on_receipt":{"type":"boolean","description":"Whether to hide the item on receipt","example":false},"gift_card":{"type":"boolean","description":"Whether the item is a gift card","example":false},"tippable":{"type":"boolean","description":"Whether the item is eligible for tips","example":true},"separate_seats":{"type":"boolean","description":"Whether the item should be separated by seat","example":false},"half_pricing":{"type":"string","enum":["none","most_expensive","step"],"description":"Half pricing rule: 'most_expensive' and 'step' are valid strings. Invalid strings are treated as 'None'","example":"most_expensive"},"report_category_id":{"type":"string","description":"Report category ID (base64 encoded)","example":"UmVwb3J0Q2F0ZWdvcnkx"},"kitchen_group_id":{"type":"string","description":"Kitchen group ID (base64 encoded)","example":"S2l0Y2hlbkdwMDE="},"available_online":{"type":"boolean","description":"Whether the item is available for online orders","example":true},"alcohol":{"type":"boolean","description":"Whether the item contains alcohol","example":false},"sizes":{"type":"array","description":"Available sizes (size_id must be unique; at most one size may have is_default set to true). Omit to leave unchanged; provide an array to replace existing size assignments.","items":{"type":"object","required":["size_id"],"properties":{"size_id":{"type":"string","description":"Size ID (base64 encoded)","example":"U0laRTAx"},"price":{"type":"number","description":"Price for this size","minimum":0,"example":12.99},"cost":{"type":"number","description":"Cost for this size","minimum":0,"example":8},"is_default":{"type":"boolean","description":"Whether this size is the item's default size. At most one size can be true; defaults to false if omitted.","default":false,"example":true}}}},"tags":{"type":"array","description":"Tags applied to the item (tag_id must be unique). Omit to leave unchanged; provide an array to replace existing tags.","items":{"type":"object","required":["tag_id"],"properties":{"tag_id":{"type":"string","description":"Tag ID (base64 encoded)","example":"VEFHMDI="}}}},"modifiers":{"type":"array","description":"Modifiers applied to the item (modifier_id must be unique). Omit to leave unchanged; provide an array to replace existing modifiers.","items":{"type":"object","required":["modifier_id"],"properties":{"modifier_id":{"type":"string","description":"Modifier ID (base64 encoded)","example":"TW9kaWZpZXIwMQ=="},"excluded_online_item":{"type":"boolean","description":"Whether to exclude this modifier from online orders","example":false},"default_ingredients":{"type":"array","description":"Default ingredients for the modifier (ingredient_id must be unique)","items":{"type":"object","required":["ingredient_id"],"properties":{"ingredient_id":{"type":"string","description":"Ingredient ID (base64 encoded)","example":"SU5HUjAx"}}}},"excluded_online_ingredients":{"type":"array","description":"Ingredients to exclude in online orders (ingredient_id must be unique)","items":{"type":"object","required":["ingredient_id"],"properties":{"ingredient_id":{"type":"string","description":"Ingredient ID (base64 encoded)","example":"SU5HUjAy"}}}}}}},"button_color":{"type":"string","description":"Button color for the item. Must be a six-digit hex color.","example":"#FF5733"}}},"MenuKitchenGroup":{"type":"object","properties":{"id":{"description":"Unique ID of kitchen group","type":"string"},"name":{"description":"Name of kitchen group","type":"string"}}},"CreateMenuKitchenGroup":{"type":"object","description":"Payload for creating a kitchen group.","required":["name"],"properties":{"name":{"description":"Name of kitchen group","type":"string","minLength":1}}},"PutMenuKitchenGroup":{"type":"object","description":"PUT payload for a kitchen group. `name` is required.","required":["name"],"properties":{"name":{"description":"Name of kitchen group","type":"string","minLength":1}},"additionalProperties":false},"PatchMenuKitchenGroup":{"type":"object","description":"PATCH payload for a kitchen group. All fields are optional.","properties":{"name":{"description":"Name of kitchen group","type":"string","minLength":1}},"additionalProperties":false},"MenuModifier":{"type":"object","properties":{"id":{"description":"Unique ID of modifier","type":"string"},"name":{"description":"Name of modifier","type":"string"},"min_choices":{"description":"Minimum number of ingredients required","type":"integer"},"max_choices":{"description":"Minimum number of ingredients allowed","type":"integer"},"allow_substitutes":{"description":"allow substitutes modifiers","type":"boolean"},"included_ingredients":{"description":"Number of included ingredients before the price changes","type":"integer"},"allow_duplicate_ingredients":{"description":"Allows the same ingredient to be selected more than once","type":"boolean"},"half_and_half":{"description":"indicates whether the modifier is configured with Half & Half behavior","type":"boolean"},"ingredients":{"description":"List of available ingredients","type":"array","items":{"properties":{"ingredient_id":{"description":"ID of ingredient","type":"string"},"price":{"description":"Price of ingredient","type":"number","format":"float"},"size_prices":{"description":"List of price overrides by size","type":"array","items":{"properties":{"size_id":{"description":"ID of size","type":"string"},"price":{"description":"Price of ingredient for size","type":"number","format":"float"}}}},"sort_order":{"description":"Indicates the display position of that ingredient within the modifier.","type":"integer"}}}},"available_online":{"description":"Allows this modifier to be seen by customers online","type":"boolean"},"button_color":{"description":"Button color for the modifier","type":"string"}}},"PutMenuModifierResponse":{"type":"object","properties":{"id":{"description":"Unique ID of modifier","type":"string"},"name":{"description":"Name of modifier","type":"string"},"min_choices":{"description":"Minimum number of ingredients required","type":"integer"},"max_choices":{"description":"Maximum number of ingredients allowed","type":"integer"},"included_ingredients":{"description":"Number of included ingredients before the price changes","type":"integer"},"allow_duplicate_ingredients":{"description":"Allows the same ingredient to be selected more than once","type":"boolean"},"available_online":{"description":"Allows this modifier to be seen by customers online","type":"boolean"},"ingredients":{"description":"List of available ingredients","type":"array","items":{"properties":{"ingredient_id":{"description":"ID of ingredient","type":"string"},"price":{"description":"Price of ingredient","type":"number","format":"float"},"size_prices":{"description":"List of price overrides by size","type":"array","items":{"properties":{"size_id":{"description":"ID of size","type":"string"},"price":{"description":"Price of ingredient for size","type":"number","format":"float"}}}}}}},"button_color":{"description":"Button color for the modifier","type":"string"}}},"MenuModifierResponse":{"type":"object","properties":{"id":{"description":"Unique ID of modifier","type":"string"}}},"MenuItemResponse":{"type":"object","properties":{"id":{"description":"Unique ID of menu item","type":"string"}}},"CreateMenuModifier":{"type":"object","required":["name","min_choices","max_choices","included_ingredients","allow_duplicate_ingredients","available_online","ingredients"],"properties":{"name":{"description":"Name of modifier","type":"string"},"min_choices":{"description":"Minimum number of ingredients required","type":"integer"},"max_choices":{"description":"Maximum number of ingredients allowed","type":"integer"},"included_ingredients":{"description":"Number of included ingredients before the price changes","type":"integer"},"allow_duplicate_ingredients":{"description":"allow duplicate ingredients","type":"boolean"},"available_online":{"description":"Available online","type":"boolean"},"ingredients":{"description":"List of available ingredients","type":"array","minItems":1,"items":{"properties":{"ingredient_id":{"description":"ID of ingredient","type":"string"},"price":{"description":"Price of ingredient","type":"number","format":"float"},"size_prices":{"description":"List of price overrides by size","type":"array","items":{"properties":{"size_id":{"description":"ID of size","type":"string"},"price":{"description":"Price of ingredient for size","type":"number","format":"float"}}}}}}},"button_color":{"description":"Button color for the modifier","type":"string","example":"#FF5733"}}},"PatchMenuModifier":{"type":"object","description":"Patch payload for an existing modifier. All fields are optional, only fields present in the request body are updated.","properties":{"name":{"description":"Name of modifier","type":"string"},"min_choices":{"description":"Minimum number of ingredients required","type":"integer","minimum":0},"max_choices":{"description":"Maximum number of ingredients allowed. Must be greater than or equal to `min_choices` when both are provided.","type":"integer","minimum":0},"included_ingredients":{"description":"Number of included ingredients before the price changes","type":"integer","minimum":0},"allow_duplicate_ingredients":{"description":"Allow duplicate ingredients","type":"boolean"},"available_online":{"description":"Available online","type":"boolean"},"ingredients":{"description":"List of ingredients to assign to this modifier. When present, fully replaces the existing ingredient list (and their `size_prices`). When present but empty, removes all existing ingredient assignments. When omitted, existing ingredient assignments remain unchanged.","type":"array","items":{"type":"object","required":["ingredient_id"],"properties":{"ingredient_id":{"description":"ID of ingredient","type":"string"},"price":{"description":"Price of ingredient","type":"number","format":"float"},"size_prices":{"description":"List of price overrides by size","type":"array","items":{"type":"object","required":["size_id"],"properties":{"size_id":{"description":"ID of size","type":"string"},"price":{"description":"Price of ingredient for size","type":"number","format":"float"}}}}}}},"button_color":{"description":"Button color for the modifier","type":"string","example":"#FF5733"}}},"PutMenuModifier":{"type":"object","description":"PUT payload for a modifier. `name` is required. All other fields are optional and default to their initial values when omitted.","required":["name"],"properties":{"name":{"description":"Name of modifier","type":"string"},"min_choices":{"description":"Minimum number of ingredients required. Defaults to `0`.","type":"integer","minimum":0,"default":0},"max_choices":{"description":"Maximum number of ingredients allowed. Must be >= `min_choices` when both provided. Defaults to `0`.","type":"integer","minimum":0,"default":0},"included_ingredients":{"description":"Number of included ingredients before price changes. Defaults to `0`.","type":"integer","minimum":0,"default":0},"allow_duplicate_ingredients":{"description":"Allow duplicate ingredients. Defaults to `false`.","type":"boolean","default":false},"available_online":{"description":"Available online. Defaults to `true`.","type":"boolean","default":true},"ingredients":{"description":"List of ingredients to assign. Fully replaces the existing ingredient list (including `size_prices`). Defaults to `[]` (clears all existing ingredient assignments when omitted).","type":"array","default":[],"items":{"type":"object","required":["ingredient_id"],"properties":{"ingredient_id":{"description":"ID of ingredient","type":"string"},"price":{"description":"Price of ingredient. Defaults to `0`.","type":"number","format":"float","default":0},"size_prices":{"description":"List of price overrides by size","type":"array","items":{"type":"object","required":["size_id"],"properties":{"size_id":{"description":"ID of size","type":"string"},"price":{"description":"Price of ingredient for size. Defaults to `0`.","type":"number","format":"float","default":0}}}}}}},"button_color":{"description":"Button color for the modifier as a 6-digit hex code. Defaults to `#00755A`.","type":"string","pattern":"^#[A-Fa-f0-9]{6}$","default":"#00755A","example":"#FF5733"}}},"MenuReportCategory":{"type":"object","properties":{"id":{"description":"Unique ID of report category","type":"string"},"name":{"description":"Name of report category","type":"string"}}},"PatchMenuReportCategory":{"type":"object","description":"Partial update for a report category.","additionalProperties":false,"properties":{"name":{"description":"Name of report category","type":"string","minLength":1}}},"PutMenuReportCategory":{"type":"object","required":["name"],"additionalProperties":false,"properties":{"name":{"description":"Name of report category","type":"string","minLength":1}}},"MenuSection":{"type":"object","properties":{"id":{"description":"Unique ID of section","type":"string"},"name":{"description":"Name of section","type":"string"},"items":{"description":"List of assigned items","type":"array","items":{"properties":{"item_id":{"description":"ID of assigned item","type":"string"},"sort_order":{"description":"Indicates the display position of that item within the section.","type":"integer"}}}},"available_online":{"description":"Whether the section is available for online ordering","type":"boolean"}}},"CreateMenuSection":{"type":"object","required":["name","available_online"],"properties":{"name":{"description":"Name of section","type":"string"},"items":{"description":"List of assigned items","type":"array","items":{"properties":{"item_id":{"description":"ID of assigned item","type":"string"}}}},"available_online":{"description":"Available online","type":"boolean"}}},"ResponseMenuSection":{"type":"object","properties":{"id":{"description":"Unique ID of section","type":"string"}}},"PatchMenuSection":{"type":"object","description":"At least one field must be provided.","properties":{"name":{"description":"Name of section (non-empty string)","type":"string","minLength":1},"items":{"description":"List of items to assign. Omit to leave unchanged; empty array clears all; non-empty replaces with 0-based sort_order.","type":"array","items":{"type":"object","required":["item_id"],"properties":{"item_id":{"description":"Base64-encoded item ID","type":"string"}}}},"available_online":{"description":"Whether the section is available for online ordering","type":"boolean"}},"additionalProperties":false},"PutMenuSection":{"type":"object","description":"Full replacement body for a section. `name` is required; omitted optional fields reset to defaults (`items`: [], `available_online`: true).","required":["name"],"properties":{"name":{"description":"Name of section (non-empty string)","type":"string","minLength":1},"items":{"description":"List of items to assign. Defaults to empty array if omitted.","type":"array","default":[],"items":{"type":"object","required":["item_id"],"properties":{"item_id":{"description":"Base64-encoded item ID","type":"string"}}}},"available_online":{"description":"Whether the section is available for online ordering. Defaults to true if omitted.","type":"boolean","default":true}},"additionalProperties":false},"MenuRevenueCenter":{"type":"object","properties":{"id":{"description":"Unique ID of revenue center","type":"string"},"name":{"description":"Name of revenue center","type":"string"}}},"CreateRevenueCenters":{"type":"object","required":["name"],"properties":{"name":{"description":"Name of revenue center","type":"string"}}},"ResponseRevenueCenters":{"type":"object","properties":{"id":{"description":"Unique ID of revenue center","type":"string"}}},"MenuSize":{"type":"object","properties":{"id":{"description":"Unique ID of size","type":"string"},"name":{"description":"Name of size","type":"string"},"short_name":{"description":"Short name of size","type":"string"},"available_online":{"description":"Available online","type":"boolean"}}},"MenuSizeResponse":{"type":"object","properties":{"id":{"description":"Unique ID of size","type":"string"}}},"CreateMenuSize":{"type":"object","required":["name","available_online"],"properties":{"name":{"description":"Name of size","type":"string","example":"size1"},"short_name":{"description":"Short name of size","type":"string","example":"short name1"},"available_online":{"description":"Available online","type":"boolean"}}},"UpdateMenuSize":{"type":"object","properties":{"name":{"description":"Name of size","type":"string","example":"size1"},"short_name":{"description":"Short name of size","type":"string","example":"short name1"}}},"PatchMenuSize":{"type":"object","properties":{"name":{"description":"Name of size","type":"string","example":"size1"},"short_name":{"description":"Short name of size","type":"string","example":"short name1"},"available_online":{"description":"Available online","type":"boolean"}}},"PutMenuSize":{"type":"object","required":["name"],"properties":{"name":{"description":"Name of size","type":"string","example":"Large"},"short_name":{"description":"Short name of size. Defaults to \"\" if omitted.","type":"string","default":"","example":"LG"},"available_online":{"description":"Available online. Defaults to true if omitted.","type":"boolean","default":true}}},"PutMenuSizeResponse":{"type":"object","properties":{"id":{"description":"Unique ID of size","type":"string"},"name":{"description":"Name of size","type":"string"},"short_name":{"description":"Short name of size","type":"string"},"available_online":{"description":"Available online","type":"boolean"}}},"MenuTag":{"type":"object","properties":{"id":{"description":"Unique ID of tag","type":"string"},"name":{"description":"Name of tag","type":"string"}}},"PatchMenuTag":{"type":"object","properties":{"name":{"description":"Name of the tag. When omitted, current value is unchanged.","type":"string"}}},"PutMenuTag":{"type":"object","additionalProperties":false,"required":["name"],"properties":{"name":{"description":"Name of tag","type":"string","minLength":1}}},"MenuTax":{"type":"object","properties":{"id":{"description":"Unique ID of tax","type":"string"},"name":{"description":"Name of tax","type":"string"},"rate":{"description":"Percentage rate of the tax","type":"number","format":"float"}}},"PatchMenuTax":{"type":"object","additionalProperties":false,"properties":{"name":{"description":"Name of tax","type":"string","minLength":1},"rate":{"description":"Percentage rate of the tax","type":"number","format":"float"}}},"PutMenuTax":{"type":"object","additionalProperties":false,"required":["name"],"properties":{"name":{"description":"Name of tax","type":"string","minLength":1},"rate":{"description":"Percentage rate of the tax. Defaults to 0 if omitted.","type":"number","format":"float","minimum":0,"default":0}}},"MenuDayparts":{"type":"object","properties":{"id":{"description":"Unique ID of Dayparts","type":"string"},"name":{"description":"Name of Dayparts","type":"string"}}},"CreateMenuDayparts":{"type":"object","required":["name"],"properties":{"name":{"description":"Name of Dayparts","type":"string"}}},"UpdateMenuDayparts":{"type":"object","properties":{"name":{"description":"Name of Dayparts","type":"string"}}},"PutMenuDayparts":{"type":"object","description":"Full replacement body for a daypart. `name` is required.","required":["name"],"properties":{"name":{"description":"Name of daypart","type":"string","minLength":1}},"additionalProperties":false},"PatchMenuDayparts":{"type":"object","properties":{"name":{"description":"Name of daypart","type":"string","minLength":1}}},"OrderTypeStatus":{"type":"object","properties":{"type":{"description":"Order type identifier. Matches the `order_type` field used in POST /v2/orders.","type":"string","enum":["carryout","delivery","eat-in"]},"accepting":{"description":"Whether this order type is currently accepting orders. True only when the order type is enabled and the order type is currently in an active window.","type":"boolean"},"prep_time_minutes":{"description":"Estimated preparation time in minutes for this order type. Included even when `accepting` is false so integrators can display estimated wait times before a scheduled window opens.","type":"integer"}}},"OrderStatus":{"type":"object","properties":{"assigned_tablet":{"description":"Whether a submit device (tablet) is configured for this store.","type":"boolean"},"tablet_status":{"description":"Current connection status of the assigned tablet.","type":"string","enum":["connected","disconnected"]},"can_receive_orders":{"description":"True only when a tablet is assigned and currently connected.","type":"boolean"},"order_types":{"description":"Order types this store supports, each with current accepting status and prep time. Use `can_receive_orders && accepting` as the definitive safe-to-send signal.","type":"array","items":{"$ref":"#/components/schemas/OrderTypeStatus"}}}},"Order":{"type":"object","properties":{"subtotal":{"description":"Order subtotal before taxes","type":"number"},"total":{"description":"Order total including taxes","type":"number"},"ticket_number":{"description":"order's ticket number","type":"string"},"staff_id":{"description":"Numeric ID of the staff member who owns the order","type":"integer"},"status":{"description":"Numeric status of the order","type":"integer","enum":[0,1,2,3],"x-enumNames":["Open","Closed","Cancelled","Discarded"],"example":1},"ticket_status":{"description":"Text status of the order derived from the numeric status","type":"string","enum":["Open","Closed","Cancelled","Discarded"],"example":"Closed"},"guest_count":{"description":"Number of guests on the order","type":"integer"},"room_id":{"description":"Numeric ID of the room associated with the order","type":"integer"},"partner_order_id":{"description":"Partner-assigned order ID, if provided at order creation","type":"string","nullable":true},"customer_info":{"description":"Customer contact and delivery address information. Address fields are not populated for orders placed on the POS.","type":"object","properties":{"name":{"type":"string"},"phone":{"type":"string"},"email":{"type":"string"},"address":{"type":"string"},"suite":{"type":"string"},"city":{"type":"string"},"state":{"type":"string"},"zip":{"type":"string"}}},"id":{"description":"Ticket graphId (ticket prefix)","type":"string"},"opened_dt":{"description":"ISO 8601 datetime when the order was opened. Empty string if not available.","type":"string","example":"2026-06-30T15:47:17+00:00"},"closed_dt":{"description":"ISO 8601 datetime when the order was closed. Empty string if still open.","type":"string","example":"2026-06-30T16:31:02+00:00"},"job_type_id":{"description":"GraphId of the job type. Empty string if not set.","type":"string"},"created_by_staff_id":{"description":"GraphId of the staff member who created the order","type":"string"},"daypart_id":{"description":"GraphId of the daypart at order close time. Empty string if order is still open or no matching daypart found.","type":"string"},"seat_count":{"description":"Number of distinct seats on the order","type":"integer"},"paid_status":{"description":"Payment status of the order","type":"string","enum":["unpaid","partial_payment","paid_in_full","not_refunded","partial_refund","refunded_in_full"]},"business_name":{"description":"Business name associated with the order. Returns the string \"null\" when not set.","type":"string"},"delivery_instructions":{"description":"Delivery instructions provided by the customer. Not populated for orders placed on the POS.","type":"string"},"promise_dt":{"description":"Unix timestamp (as string) of the promised pickup/delivery time. Null if not set, or for orders placed on the POS.","type":"string","nullable":true,"example":"1782836400"},"table":{"description":"Table assigned to the order. For POS (dine-in) orders the id returns the order's table graphId; the name is not populated. Both fields return the string \"null\" when no table is assigned.","type":"object","properties":{"id":{"description":"Table graphId or the string \"null\"","type":"string"},"name":{"description":"Table name or the string \"null\"","type":"string"}}},"revenue_center_id":{"description":"GraphId of the revenue center associated with the order's room. Null if none.","type":"string","nullable":true},"alternate_id":{"description":"Alternate order ID (e.g. from a third-party integration). Returns the string \"null\" when not set.","type":"string"},"net_sales":{"description":"Net sales amount as a decimal string","type":"string","example":"12.00"},"gross_sales":{"description":"Gross sales amount as a decimal string","type":"string","example":"12.00"},"tax_exempt":{"description":"Whether the order is tax exempt","type":"string","enum":["true","false"]},"adjustments":{"type":"array","items":{"type":"object","properties":{"adjustmentName":{"description":"Display name of the adjustment","type":"string"},"total":{"description":"Adjustment total amount","type":"string"},"id":{"description":"GraphId of the ticket adjustment record","type":"string"},"added_dt":{"description":"ISO 8601 datetime when the adjustment was added","type":"string"},"voided_dt":{"description":"ISO 8601 datetime when the adjustment was voided. Empty string if not voided.","type":"string"},"adjustment_id":{"description":"GraphId of the adjustment type","type":"string"},"non_revenue":{"description":"Whether the adjustment is non-revenue","type":"string","enum":["true","false"]},"tax_exempt":{"description":"Whether the adjustment is tax exempt","type":"string","enum":["true","false"]},"service_charge":{"description":"Whether the adjustment is a service charge / gratuity","type":"string","enum":["true","false"]}}}},"items":{"type":"array","items":{"type":"object","properties":{"itemName":{"description":"Display name of the item","type":"string"},"subtotal":{"description":"Item subtotal","type":"number"},"total":{"description":"Item total","type":"number"},"id":{"description":"GraphId of the ticket item record","type":"string"},"added_dt":{"description":"ISO 8601 datetime when the item was added","type":"string"},"description":{"description":"Menu item description","type":"string"},"voided_dt":{"description":"ISO 8601 datetime when the item was voided. Empty string if not voided.","type":"string"},"void_staff_id":{"description":"GraphId of the staff member who voided the item","type":"string"},"course":{"description":"Course number of the item","type":"integer"},"seat":{"description":"Seat number of the item","type":"integer"},"item_id":{"description":"GraphId of the menu item","type":"string"},"size_id":{"description":"GraphId of the item size","type":"string"},"section_id":{"description":"GraphId of the menu section","type":"string"},"group_id":{"description":"GraphId of the menu group","type":"string"},"discount_id":{"description":"GraphId of the applied discount","type":"string"},"discount_price":{"description":"Discount amount applied to this item","type":"string"},"auto_discount_price":{"description":"Auto-applied discount amount","type":"string"},"sub_item":{"description":"Whether this item is a sub-item","type":"string","enum":["true","false"]},"parent_id":{"description":"GraphId of the parent item if this is a sub-item. Empty string otherwise.","type":"string"},"non_revenue":{"description":"Whether the item is non-revenue","type":"string","enum":["true","false"]},"tax_exempt":{"description":"Whether the item is tax exempt","type":"string","enum":["true","false"]},"quantity":{"description":"Quantity of the item","type":"integer"},"measured_amount":{"description":"Measured weight/time amount for weighted items. 0 for non-weighted items.","type":"number"},"measurement_type":{"description":"Unit of measurement for weighted items","type":"string","enum":["not_measured","per_unit","per_pound","per_ounce","per_minute","unknown"]},"cost":{"description":"Plate cost of the item","type":"string"},"net_sales":{"description":"Net sales amount for this item","type":"string"},"gross_sales":{"description":"Gross sales amount for this item","type":"string"},"gift_card":{"description":"Whether the item is a gift card","type":"string","enum":["true","false"]}}}},"taxes":{"type":"array","items":{"type":"object","properties":{"price":{"description":"Tax amount","type":"number"},"id":{"description":"GraphId of the ticket tax record","type":"string"},"name":{"description":"Tax name from the location tax configuration","type":"string"},"tax_id":{"description":"GraphId of the tax configuration","type":"string"},"total_inclusive":{"description":"Inclusive tax amount (tax already included in item price)","type":"string"}}}},"transactions":{"type":"array","items":{"type":"object","properties":{"amount":{"description":"Transaction amount","type":"number"},"tip":{"description":"Tip amount","type":"number"},"total":{"description":"Transaction total including tip","type":"number"},"id":{"description":"GraphId of the ticket transaction record","type":"string"},"added_dt":{"description":"ISO 8601 datetime when the transaction was added","type":"string"},"void_dt":{"description":"ISO 8601 datetime when the transaction was voided. Empty string if not voided.","type":"string"},"staff_id":{"description":"GraphId of the staff member who processed the transaction","type":"string"},"type":{"description":"Payment method type","type":"string","enum":["cash","credit_card","house_account","gift_card","debit_card","unknown"]},"status":{"description":"Transaction status","type":"string","enum":["sale","void","capture","auth","adjust"]},"card_type":{"description":"Card brand for credit/debit transactions","type":"string"},"card_num":{"description":"Masked card number","type":"integer","nullable":true},"card_name":{"description":"Cardholder name","type":"string","nullable":true},"house_account_id":{"description":"GraphId of the house account used for payment","type":"string"},"ref":{"description":"Payment processor reference number","type":"integer","nullable":true},"additional_info":{"description":"Additional payment reference information","type":"object","properties":{"reference":{"description":"Capture/settle reference number from the payment processor. Null if not yet captured.","type":"integer","nullable":true}}}}}},"ingredients":{"description":"All active modifier ingredients across all items on the order","type":"array","items":{"type":"object","properties":{"id":{"description":"GraphId of the ticket ingredient record","type":"string"},"name":{"description":"Ingredient name","type":"string"},"added_dt":{"description":"ISO 8601 datetime when the ingredient was added. Empty string if not available.","type":"string"},"void_dt":{"description":"ISO 8601 datetime when the ingredient was removed. Empty string if still active.","type":"string"},"ticket_item_id":{"description":"GraphId of the parent ticket item","type":"string"},"item_id":{"description":"GraphId of the menu item this ingredient belongs to","type":"string"},"size_id":{"description":"GraphId of the item size","type":"string"},"section_id":{"description":"GraphId of the menu section","type":"string"},"group_id":{"description":"GraphId of the menu group","type":"string"},"modifier_id":{"description":"GraphId of the modifier template this ingredient belongs to","type":"string"},"ingredient_id":{"description":"GraphId of the menu ingredient","type":"string"},"default_on":{"description":"Whether the ingredient is enabled by default","type":"string","enum":["true","false"]},"price":{"description":"Price of the ingredient as a decimal string","type":"string","example":"0.00"}}}},"removed_ingredients":{"description":"Modifier ingredients that were removed (disabled) from items on the order","type":"array","items":{"type":"object","properties":{"id":{"description":"GraphId of the ticket ingredient record","type":"string"},"name":{"description":"Ingredient name","type":"string"},"added_dt":{"description":"ISO 8601 datetime when the ingredient was added. Empty string if not available.","type":"string"},"void_dt":{"description":"ISO 8601 datetime when the ingredient was removed. Empty string if still active.","type":"string"},"ticket_item_id":{"description":"GraphId of the parent ticket item","type":"string"},"item_id":{"description":"GraphId of the menu item this ingredient belongs to","type":"string"},"size_id":{"description":"GraphId of the item size","type":"string"},"section_id":{"description":"GraphId of the menu section","type":"string"},"group_id":{"description":"GraphId of the menu group","type":"string"},"modifier_id":{"description":"GraphId of the modifier template this ingredient belongs to","type":"string"},"ingredient_id":{"description":"GraphId of the menu ingredient","type":"string"},"default_on":{"description":"Whether the ingredient is enabled by default","type":"string","enum":["true","false"]},"price":{"description":"Price of the ingredient as a decimal string","type":"string","example":"0.00"}}}}}},"OrderItem":{"type":"object","required":["id"],"properties":{"id":{"description":"Base64-encoded GraphQL ID returned by `/v2/menu/items`, in the form `base64(\"item:<ItemID>\")`.","type":"string"},"quantity":{"description":"How many items of the same description.","type":"number","default":1},"measured_amount":{"description":"How weight items of measured item.","type":"number","default":1},"modifiers":{"description":"Array of modifier objects.","type":"array","items":{"$ref":"#/components/schemas/OrderModifier"}},"special_request":{"description":"Additional request for the item. Truncated to 150 characters.","type":"string"},"size":{"description":"Base64-encoded GraphQL ID returned by `/v2/menu/sizes`, in the form `base64(\"size:<SizeID>\")`.","type":"string"},"misc_item":{"type":"object","properties":{"misc_name":{"description":"Name for the miscellaneous item.","type":"string","default":"Misc Item"},"misc_price":{"description":"Price for the miscellaneous item.","type":"number","default":1}}}}},"OrderModifier":{"type":"object","required":["ingredient_id","modifier_id"],"properties":{"ingredient_id":{"description":"Base64-encoded GraphQL ID returned by `/v2/menu/ingredients`, in the form `base64(\"ingredient:<IngredientID>\")`.","type":"string"},"modifier_id":{"description":"Base64-encoded GraphQL ID returned by `/v2/menu/modifiers`, in the form `base64(\"modifier:<ModifierID>\")`.","type":"string"},"segment_id":{"description":"Left or Right half of the item, signified by either -1 or -2, respectively.","type":"number","enum":[-1,-2]},"context_id":{"description":"Base64-encoded GraphQL ID returned by `/v2/menu/contextItems`, in the form `base64(\"contextItem:<ContextItemID>\")`. Supported for this modifier and any nested modifier layers when modifiers are recursively nested.","type":"string"},"subitem":{"description":"Order item linked to this modifier or ingredient.","type":"object","properties":{"id":{"description":"Base64-encoded GraphQL ID returned by `/v2/menu/items`, in the form `base64(\"item:<ItemID>\")`.","type":"string"},"modifiers":{"description":"Array of modifier objects.","type":"array","items":{"type":"object","properties":{"ingredient_id":{"description":"Base64-encoded GraphQL ID returned by `/v2/menu/ingredients`, in the form `base64(\"ingredient:<IngredientID>\")`.","type":"string"},"modifier_id":{"description":"Base64-encoded GraphQL ID returned by `/v2/menu/modifiers`, in the form `base64(\"modifier:<ModifierID>\")`.","type":"string"}}}}}}}},"Orders":{"type":"object","required":["customer_info","items"],"properties":{"customer_info":{"description":"Information about the customer the order is being placed for.","type":"object","required":["name","phone"],"properties":{"name":{"description":"Customer Name.","type":"string"},"phone":{"description":"Customer Phone number Can be used to identify the customer for loyalty purposes.","type":"string"},"email":{"description":"Customer Email Address. Can be used to identify the customer for loyalty purposes.","type":"string"},"address":{"description":"Customer Address. Only required for `order_type` 'delivery'.","type":"string"},"suite":{"description":"Customer Suite.","type":"string"},"city":{"description":"Customer City. Only required for `order_type` 'delivery'.","type":"string"},"state":{"description":"Customer State. Only required for `order_type` 'delivery'.","type":"string"},"zip":{"description":"Customer Zip. Only required for `order_type` 'delivery'.","type":"string"}}},"discounts":{"type":"array","required":["discount_id"],"items":{"properties":{"discount_id":{"description":"Base64-encoded GraphQL ID returned by `/v2/menu/adjustments`, in the form `base64(\"adjustment:<AdjustmentID>\")`, where `service_charge` = `false`.","type":"string"},"item_id":{"description":"Base64-encoded GraphQL ID returned by `/v2/menu/items`, in the form `base64(\"item:<ItemID>\")`, identifying the item to which the discount applies.","type":"string"},"amount":{"description":"Dollar amount of the discount. If the adjustment is a percent, this field will be ignored. The default amount is applied if no amount given. If amount given, ensure that it is within the `adjustments object` `min_amount ` & `max_amount`, inclusive.","type":"number"}}}},"drive_time":{"description":"Estimated time for a driver to arrive at the location to pickup the order, in seconds.","type":"number","default":0},"items":{"description":"Array of Item, Modifier, Segment, and Context objects for the Order.","type":"array","items":{"$ref":"#/components/schemas/OrderItem"}},"order_notes":{"description":"Notes for the order as a whole. Generally used for 'Delivery Instructions'. Truncated to 200 characters.","type":"string"},"order_type":{"description":"The type of order. Most orders will use either 'carryout' or 'delivery'. The type will be defaulted to 'carryout' if not given.","type":"string","default":"carryout","enum":["carryout","delivery","egift","eat-in"]},"payment":{"description":"The order payment details. The order payment will be defaulted to 'unpaid' if not given.","type":"object","required":["payment_option"],"properties":{"payment_option":{"description":"Base64-encoded GraphQL ID returned by `/v2/setup/houseAccounts`, in the form `base64(\"houseAccount:<HouseAccountID>\")`, or `unpaid`.","type":"string","default":"unpaid"},"tip":{"description":"Amount to tip, to be calcuated into the order.","type":"number","default":0}}},"promise_time":{"description":"The earliest time when the order should be available for pickup. Expressed in seconds since epoch/unix time.","type":"number","default":"As Soon as Possible e.g. `now`."},"room_id":{"description":"Base64-encoded GraphQL ID returned by `/v2/setup/rooms`, in the form `base64(\"room:<RoomID>\")`. Used to override the default room for the order type.","type":"string","default":"Room ID default for the order_type."},"service_charges":{"description":"Charges that can be applied to the order. Auto-applied service charges should not be given.","type":"array","required":["service_charge_id"],"items":{"properties":{"service_charge_id":{"description":"Base64-encoded GraphQL ID returned by `/v2/menu/adjustments`, in the form `base64(\"adjustment:<AdjustmentID>\")`, where `service_charge` = `true`.","type":"string"},"amount":{"description":"Amount for the service charge","type":"number"}}}},"table_id":{"description":"Base64-encoded GraphQL ID for the table, in the form `base64(\"table:<TableID>\")`.","type":"string"},"skip_address_verification":{"default":false,"description":"Determine whether to bypass address verification","type":"boolean"},"guest_count":{"description":"Number of guests for the order. Must be a non-negative integer. Defaults to 1 if not provided.","type":"integer","minimum":0},"partner_order_id":{"description":"An idempotency key supplied by the integration partner to prevent duplicate orders. Must be a non-empty string. Values exceeding 255 characters are silently truncated to 255 before storage. Requires an integration partner API key. Returns 409 if an order with the same `partner_order_id` already exists for this merchant.","type":"string","maxLength":255}}},"PaginatedTicketItemsResponse":{"type":"object","description":"Paginated response format returned when page and limit query parameters are provided","properties":{"data":{"description":"Array of ticket items for the current page","type":"array","items":{"$ref":"#/components/schemas/TicketItem"}},"pagination":{"$ref":"#/components/schemas/PaginationMetadata"}},"required":["data","pagination"]},"PaginatedTicketIngredientsResponse":{"type":"object","description":"Paginated response format returned when page and limit query parameters are provided","properties":{"data":{"description":"Array of ticket ingredients for the current page","type":"array","items":{"$ref":"#/components/schemas/TicketIngredient"}},"pagination":{"$ref":"#/components/schemas/PaginationMetadata"}},"required":["data","pagination"]},"PaginatedTicketInfoResponse":{"type":"object","description":"Paginated response format returned when page and/or limit query parameters are provided","properties":{"data":{"description":"Array of tickets for the current page","type":"array","items":{"$ref":"#/components/schemas/Ticket"}},"pagination":{"$ref":"#/components/schemas/PaginationMetadata"}},"required":["data","pagination"]},"PaginatedTicketAdjustmentsResponse":{"type":"object","description":"Paginated response format returned when page and limit query parameters are provided","properties":{"data":{"description":"Array of ticket adjustments for the current page","type":"array","items":{"$ref":"#/components/schemas/TicketAdjustment"}},"pagination":{"$ref":"#/components/schemas/PaginationMetadata"}},"required":["data","pagination"]},"PaginatedTicketTaxesResponse":{"type":"object","description":"Paginated response format returned when page and limit query parameters are provided","properties":{"data":{"description":"Array of ticket taxes for the current page","type":"array","items":{"$ref":"#/components/schemas/TicketTax"}},"pagination":{"$ref":"#/components/schemas/PaginationMetadata"}},"required":["data","pagination"]},"PaginatedTicketSurchargesResponse":{"type":"object","description":"Paginated response format returned when page and limit query parameters are provided","properties":{"data":{"description":"Array of ticket surcharges for the current page","type":"array","items":{"$ref":"#/components/schemas/TicketSurcharge"}},"pagination":{"$ref":"#/components/schemas/PaginationMetadata"}},"required":["data","pagination"]},"PaginatedTicketTransactionsResponse":{"type":"object","description":"Paginated response format returned when page and limit query parameters are provided","properties":{"data":{"description":"Array of ticket transactions for the current page","type":"array","items":{"$ref":"#/components/schemas/TicketTransaction"}},"pagination":{"$ref":"#/components/schemas/PaginationMetadata"}},"required":["data","pagination"]},"PaginatedSalesItemsResponse":{"type":"object","description":"Paginated response format returned when page and limit query parameters are provided","properties":{"data":{"description":"Array of sales items for the current page","type":"array","items":{"$ref":"#/components/schemas/SalesItem"}},"pagination":{"$ref":"#/components/schemas/PaginationMetadata"}},"required":["data","pagination"]},"SalesAdjustment":{"type":"object","properties":{"adjustment_id":{"description":"ID of menu adjustment","type":"string"},"quantity":{"description":"Total quantity","type":"integer"},"total":{"description":"Total amount","type":"number","format":"float"}}},"SalesDaypart":{"type":"object","properties":{"daypart_id":{"description":"ID of daypart","type":"string"},"quantity":{"description":"Total quantity","type":"integer"},"seat_count":{"description":"Total seat count","type":"integer"},"guest_count":{"description":"Total guest count","type":"integer"},"net_sales":{"description":"Total net sales","type":"number","format":"float"},"gross_sales":{"description":"Total gross sales","type":"number","format":"float"}}},"SalesDiscount":{"type":"object","properties":{"discount_id":{"description":"ID of menu discount","type":"string"},"quantity":{"description":"Total quantity","type":"integer"},"total":{"description":"Total amount","type":"number","format":"float"}}},"SalesGroup":{"type":"object","properties":{"group_id":{"description":"ID of menu group","type":"string"},"quantity":{"description":"Total quantity","type":"integer"},"net_sales":{"description":"Total net sales","type":"number","format":"float"},"gross_sales":{"description":"Total gross sales","type":"number","format":"float"}}},"SalesHourlyItem":{"type":"object","properties":{"hour":{"description":"Localized hour when items were added","type":"integer"},"quantity":{"description":"Total quantity","type":"integer"},"net_sales":{"description":"Total net sales","type":"number","format":"float"},"gross_sales":{"description":"Total gross sales","type":"number","format":"float"}}},"SalesHourlyTicket":{"type":"object","properties":{"hour":{"description":"Localized hour when tickets were closed","type":"integer"},"quantity":{"description":"Total quantity","type":"integer"},"seat_count":{"description":"Total seat count","type":"integer"},"guest_count":{"description":"Total guest count","type":"integer"},"net_sales":{"description":"Total net sales","type":"number","format":"float"},"gross_sales":{"description":"Total gross sales","type":"number","format":"float"}}},"SalesItem":{"type":"object","properties":{"item_id":{"description":"ID of menu item","type":"string"},"size_id":{"description":"ID of menu size","type":"string"},"quantity":{"description":"Total quantity","type":"integer"},"net_sales":{"description":"Total net sales","type":"number","format":"float"},"gross_sales":{"description":"Total gross sales","type":"number","format":"float"},"cost":{"description":"Total plate cost","type":"number","format":"float"}}},"SalesReportCategory":{"type":"object","properties":{"report_category_id":{"description":"ID of menu report category","type":"string"},"quantity":{"description":"Total quantity","type":"integer"},"net_sales":{"description":"Total net sales","type":"number","format":"float"},"gross_sales":{"description":"Total gross sales","type":"number","format":"float"}}},"SalesRoom":{"type":"object","properties":{"room_id":{"description":"ID of menu room","type":"string"},"quantity":{"description":"Total quantity","type":"integer"},"seat_count":{"description":"Total seat count","type":"integer"},"guest_count":{"description":"Total guest count","type":"integer"},"net_sales":{"description":"Total net sales","type":"number","format":"float"},"gross_sales":{"description":"Total gross sales","type":"number","format":"float"}}},"SalesStaff":{"type":"object","properties":{"staff_id":{"description":"Base64-encoded staff graph ID of the form `base64(\"staff:<StaffID>\")`, where `StaffID` is an integer. Special buckets: `c3RhZmY6LTE=` (`staff:-1`) = Online Order User, `c3RhZmY6MA==` (`staff:0`) = Unassigned.","type":"string"},"staff_name":{"description":"Staff display name. Special bucket names: `Online Order User` (`staff_id = c3RhZmY6LTE=`), `Unassigned` (`staff_id = c3RhZmY6MA==`).","type":"string"},"ticket_count":{"description":"Total ticket count. `0` for active staff with no orders in the range.","type":"integer"},"guest_count":{"description":"Total guest count. `0` for active staff with no orders in the range.","type":"integer"},"net_sales":{"description":"Total net sales. `0` for active staff with no orders in the range.","type":"number","format":"float"},"gross_sales":{"description":"Total gross sales. `0` for active staff with no orders in the range.","type":"number","format":"float"},"total":{"description":"Total ticket total. `0` for active staff with no orders in the range.","type":"number","format":"float"},"seat_count":{"description":"Total seat count. `0` for active staff with no orders in the range.","type":"integer"}}},"SalesSection":{"type":"object","properties":{"section_id":{"description":"ID of menu section","type":"string"},"quantity":{"description":"Total quantity","type":"integer"},"net_sales":{"description":"Total net sales","type":"number","format":"float"},"gross_sales":{"description":"Total gross sales","type":"number","format":"float"}}},"SalesSurcharge":{"type":"object","properties":{"room_id":{"description":"ID of room","type":"string"},"quantity":{"description":"Total quantity","type":"integer"},"total":{"description":"Total surcharges","type":"number","format":"float"}}},"SalesTax":{"type":"object","properties":{"tax_id":{"description":"ID of tax","type":"string"},"quantity":{"description":"Total quantity","type":"integer"},"total":{"description":"Total tax (non-inclusive)","type":"number","format":"float"},"total_inclusive":{"description":"Total tax (inclusive)","type":"number","format":"float"},"taxable_sales":{"description":"Total taxable base for this tax","type":"number","format":"float"}}},"SalesTaxCategory":{"type":"object","properties":{"taxable_items":{"description":"Total of taxable items","type":"number","format":"float"},"tax_inclusive_items":{"description":"Total of tax-inclusive items","type":"number","format":"float"},"taxable_adjustments":{"description":"Total of taxable adjustments","type":"number","format":"float"},"taxable_total":{"description":"Total amount to be taxes","type":"number","format":"float"},"tax_exempt_items":{"description":"Total of tax-exempt items","type":"number","format":"float"}}},"SalesTipPayout":{"type":"object","properties":{"staff_id":{"description":"ID of staff","type":"string"},"cash":{"description":"Total tips paid in cash","type":"number","format":"float"},"payroll":{"description":"Total tips to be paid on payroll","type":"number","format":"float"},"merchant":{"description":"Total tips paid to merchant","type":"number","format":"float"},"tip_out":{"description":"Total tip outs paid to staff","type":"number","format":"float"},"tip_in":{"description":"Total tip outs collected from staff","type":"number","format":"float"},"total":{"description":"Total tips received","type":"number","format":"float"},"reported":{"description":"Total tips reported by staff on punch outs","type":"number","format":"float"}}},"SalesTotal":{"type":"object","properties":{"gross_items":{"description":"Total gross sales of items","type":"number","format":"float"},"non_revenue_items":{"description":"Total sales of non-revenue items","type":"number","format":"float"},"positive_adjustments":{"description":"Total amount of positive adjustments","type":"number","format":"float"},"gross_sales":{"description":"Total gross sales of tickets","type":"number","format":"float"},"auto_discounts":{"description":"Total amount of auto priced discounts","type":"number","format":"float"},"discounts":{"description":"Total amount of discounts","type":"number","format":"float"},"adjustments":{"description":"Total amount of adjustments","type":"number","format":"float"},"rewards":{"description":"Total amount of used loyalty rewards","type":"number","format":"float"},"net_sales":{"description":"Total net sales","type":"number","format":"float"},"taxes":{"description":"Total taxes collected (non-inclusive)","type":"number","format":"float"},"tax_inclusive":{"description":"Total taxes collected (inclusive)","type":"number","format":"float"},"surcharges":{"description":"Total surcharges collected","type":"number","format":"float"},"service_charges":{"description":"Total service charges collected","type":"number","format":"float"},"tips":{"description":"Total tips","type":"number","format":"float"},"gross_receipts":{"description":"Total gross receipts for the day","type":"number","format":"float"},"taxable_sales":{"description":"Total taxable base for the requested date range","type":"number","format":"float"}}},"SalesTotalDaily":{"type":"object","properties":{"sales_dt":{"description":"Date of sales captured","type":"string","format":"date"},"gross_items":{"description":"Total gross sales of items","type":"number","format":"float"},"non_revenue_items":{"description":"Total sales of non-revenue items","type":"number","format":"float"},"positive_adjustments":{"description":"Total amount of positive adjustments","type":"number","format":"float"},"gross_sales":{"description":"Total gross sales of tickets","type":"number","format":"float"},"auto_discounts":{"description":"Total amount of auto priced discounts","type":"number","format":"float"},"discounts":{"description":"Total amount of discounts","type":"number","format":"float"},"adjustments":{"description":"Total amount of adjustments","type":"number","format":"float"},"rewards":{"description":"Total amount of used loyalty rewards","type":"number","format":"float"},"net_sales":{"description":"Total net sales","type":"number","format":"float"},"taxes":{"description":"Total taxes collected (non-inclusive)","type":"number","format":"float"},"tax_inclusive":{"description":"Total taxes collected (inclusive)","type":"number","format":"float"},"surcharges":{"description":"Total surcharges collected","type":"number","format":"float"},"service_charges":{"description":"Total service charges collected","type":"number","format":"float"},"tips":{"description":"Total tips","type":"number","format":"float"},"gross_receipts":{"description":"Total gross receipts for the day","type":"number","format":"float"},"taxable_sales":{"description":"Total taxable sales for the day","type":"number","format":"float"}}},"Ticket":{"type":"object","properties":{"id":{"description":"Unique ID of ticket","type":"string"},"opened_dt":{"description":"Open date/time of the ticket","type":"string","format":"date-time"},"closed_dt":{"description":"Closed date/time of the ticket","type":"string","format":"date-time"},"promise_dt":{"description":"Promised date/time for the ticket","type":"string","format":"date-time"},"staff_id":{"description":"ID of the assigned staff","type":"string"},"void_staff_id":{"description":"ID of the void staff","type":"string"},"void_reason":{"description":"void reason","type":"string"},"void_reason_description":{"description":"void reason description","type":"string"},"job_type_id":{"description":"ID of the assigned staff job type","type":"string"},"created_by_staff_id":{"description":"ID of the staff who created the ticket","type":"string"},"daypart_id":{"description":"ID of the daypart when the ticket is closed","type":"string"},"room_id":{"description":"ID of the room","type":"string"},"revenue_center_id":{"description":"ID of the revenue center","type":"string"},"guest_count":{"description":"Number of guests on the ticket","type":"integer"},"seat_count":{"description":"Number of unique seats on the ticket","type":"integer"},"status":{"description":"Status of the ticket","type":"string","enum":["open","closed","cancelled","combined"],"example":"open"},"paid_status":{"description":"Paid status of the ticket","type":"string","enum":["unpaid","partial_payment","paid_in_full","not_refunded","partial_refund","refunded_in_full"],"example":"unpaid"},"ticket_number":{"description":"Ticket number","type":"string"},"phone":{"description":"Guest phone number on the ticket","type":"string"},"guest_name":{"description":"Guest name on the ticket","type":"string"},"guest_vehicle":{"description":"Guest vehicle information on the ticket","type":"object","properties":{"make":{"description":"Vehicle make","type":"string"},"model":{"description":"Vehicle model","type":"string"},"color":{"description":"Vehicle color","type":"string"}}},"business_name":{"description":"Business name on the ticket","type":"string"},"email":{"description":"Guest email on the ticket","type":"string"},"alternate_id":{"description":"Alternate id on the ticket","type":"string"},"subtotal":{"description":"Subtotal of the ticket, before taxes","type":"number","format":"float"},"total":{"description":"Total of the ticket, after taxes","type":"number","format":"float"},"net_sales":{"description":"Net sales","type":"number","format":"float"},"gross_sales":{"description":"Gross sales","type":"number","format":"float"},"tax_exempt":{"description":"Ticket is marked as tax exempt","type":"boolean"}}},"TicketItem":{"type":"object","properties":{"id":{"description":"Unique ID of ticket item","type":"string"},"ticket_id":{"description":"Unique ID of the ticket","type":"string"},"ticket_status":{"description":"Status of the ticket","type":"string","enum":["open","closed","cancelled","combined"],"example":"open"},"ticket_paid_status":{"description":"Paid status of the ticket","type":"string","enum":["unpaid","partial_payment","paid_in_full","not_refunded","partial_refund","refunded_in_full"],"example":"unpaid"},"ticket_number":{"description":"Ticket number","type":"string"},"added_dt":{"description":"Added date/time of the item","type":"string"},"voided_dt":{"description":"Voided date/time of the item","type":"string"},"course":{"description":"Assigned course of the item","type":"string"},"seat":{"description":"Seat number of the item","type":"string"},"item_id":{"description":"ID of the menu item","type":"string"},"size_id":{"description":"ID of the menu size","type":"string"},"section_id":{"description":"ID of the menu section","type":"string"},"group_id":{"description":"ID of the menu group","type":"string"},"discount_id":{"description":"ID of the discount","type":"string"},"discount_price":{"description":"Amount discounted","type":"number","format":"float"},"discount_staff_id":{"description":"ID of the staff who applied the discount","type":"string"},"discount_reason_description":{"description":"Description of the discount reason","type":"string"},"auto_discount_price":{"description":"Amount discounted from auto pricing rules","type":"number","format":"float"},"sub_item":{"description":"This item is a sub item, it's price is rolled up into the parent item","type":"boolean"},"parent_id":{"description":"ID of the parent ticket item","type":"string"},"quantity":{"description":"Quantity ordered","type":"string"},"cost":{"description":"Plate cost of the item","type":"number","format":"float"},"subtotal":{"description":"Subtotal of the item","type":"number","format":"float"},"total":{"description":"Total price of the item, including all ingredients","type":"number","format":"float"},"net_sales":{"description":"Net sales of the item","type":"number","format":"float"},"gross_sales":{"description":"Gross sales of the item","type":"number","format":"float"},"staff_id":{"description":"ID of the staff member who added the item","type":"string"},"void_staff_id":{"description":"ID of the staff member who voided the item","type":"string"},"void_reason":{"description":"Reason for the void of the item","type":"string"},"void_reason_description":{"description":"Description for the void of the item","type":"string"},"measured_amount":{"description":"Measured amount for measured items","type":"number","format":"float"},"measurement_type":{"description":"Type of measurement (not_measured, weight, volume, etc.)","type":"string","enum":["not_measured","per_unit","per_pound","per_ounce","per_minute","per_kilogram"],"example":"per_unit"},"open_item_name":{"description":"Open name of the item","type":"string"},"special_instructions":{"description":"Special instructions of the item","type":"string"}}},"TicketIngredient":{"type":"object","properties":{"id":{"description":"Unique ID of ticket ingredient","type":"string"},"ticket_id":{"description":"Unique ID of the ticket","type":"string"},"ticket_status":{"description":"Status of the ticket","type":"string","enum":["open","closed","cancelled","combined"],"example":"open"},"ticket_paid_status":{"description":"Paid status of the ticket","type":"string","enum":["unpaid","partial_payment","paid_in_full","not_refunded","partial_refund","refunded_in_full"],"example":"unpaid"},"ticket_number":{"description":"Ticket number","type":"string"},"added_dt":{"description":"Added date/time of the item","type":"string"},"voided_dt":{"description":"Voided date/time of the item","type":"string"},"ticket_item_id":{"description":"Unique ID of the ticket item","type":"string"},"item_id":{"description":"ID of the menu item","type":"string"},"size_id":{"description":"ID of the menu size","type":"string"},"section_id":{"description":"ID of the menu section","type":"string"},"group_id":{"description":"ID of the menu group","type":"string"},"modifier_id":{"description":"ID of the menu modifier","type":"string"},"ingredient_id":{"description":"ID of the menu ingredient","type":"string"},"default_on":{"description":"Ingredient was defaulted on","type":"boolean"},"price":{"description":"Price of the ingredient","type":"number","format":"float"},"enabled":{"description":"Indicates whether the ingredient is enabled. This value is false when a default ingredient is removed.","type":"boolean"},"open_ingredient_name":{"description":"Open name of the ingredient","type":"string"},"special_instructions":{"description":"Special instructions of the ingredient","type":"string"}}},"TicketAdjustment":{"type":"object","properties":{"id":{"description":"Unique ID of ticket adjustment","type":"string"},"ticket_id":{"description":"Unique ID of the ticket","type":"string"},"ticket_status":{"description":"Status of the ticket","type":"string","enum":["open","closed","cancelled","combined"],"example":"open"},"ticket_paid_status":{"description":"Paid status of the ticket","type":"string","enum":["unpaid","partial_payment","paid_in_full","not_refunded","partial_refund","refunded_in_full"],"example":"unpaid"},"ticket_number":{"description":"Ticket number","type":"string"},"added_dt":{"description":"Added date/time of the adjustment","type":"string"},"voided_dt":{"description":"Voided date/time of the adjustment","type":"string"},"adjustment_id":{"description":"ID of the menu adjustment","type":"string"},"adjustment_description":{"description":"Adjustment description","type":"string"},"non_revenue":{"description":"Adjustment is non-revenue for reporting","type":"boolean"},"tax_exempt":{"description":"Does not increase or reduce the amount of tax collected","type":"boolean"},"service_charge":{"description":"Adjustment is a gratuity paid out to the staff","type":"boolean"},"total":{"description":"Total price of the adjustment","type":"number","format":"float"},"staff_id":{"description":"ID of the staff member who added the adjustment","type":"string"},"void_staff_id":{"description":"ID of the staff member who voided the adjustment","type":"string"}}},"TicketTax":{"type":"object","properties":{"id":{"description":"Unique ID of ticket tax","type":"string"},"ticket_id":{"description":"Unique ID of the ticket","type":"string"},"ticket_status":{"description":"Status of the ticket","type":"string","enum":["open","closed","cancelled","combined"],"example":"open"},"ticket_paid_status":{"description":"Paid status of the ticket","type":"string","enum":["unpaid","partial_payment","paid_in_full","not_refunded","partial_refund","refunded_in_full"],"example":"unpaid"},"ticket_number":{"description":"Ticket number","type":"string"},"tax_id":{"description":"ID of the menu tax","type":"string"},"total":{"description":"Total amount of the tax (non-inclusive)","type":"number","format":"float"},"total_inclusive":{"description":"Total amount of the tax (inclusive)","type":"number","format":"float"},"taxable_sales":{"description":"total pre-tax sales amount subject to this tax rate for the given ticket","type":"number","format":"float"}}},"TicketSurcharge":{"type":"object","properties":{"id":{"description":"Unique ID of ticket surcharge","type":"string"},"ticket_id":{"description":"Unique ID of the ticket","type":"string"},"ticket_status":{"description":"Status of the ticket","type":"string","enum":["open","closed","cancelled","combined"],"example":"open"},"ticket_paid_status":{"description":"Paid status of the ticket","type":"string","enum":["unpaid","partial_payment","paid_in_full","not_refunded","partial_refund","refunded_in_full"],"example":"unpaid"},"ticket_number":{"description":"Ticket number","type":"string"},"room_id":{"description":"ID of the room","type":"string"},"total":{"description":"Total amount of the surcharge","type":"number","format":"float"}}},"TicketTransaction":{"type":"object","properties":{"id":{"description":"Unique ID of ticket transaction","type":"string"},"ticket_id":{"description":"Unique ID of the ticket","type":"string"},"ticket_status":{"description":"Status of the ticket","type":"string","enum":["open","closed","cancelled","combined"],"example":"open"},"ticket_paid_status":{"description":"Paid status of the ticket","type":"string","enum":["unpaid","partial_payment","paid_in_full","not_refunded","partial_refund","refunded_in_full"],"example":"unpaid"},"ticket_number":{"description":"Ticket number","type":"string"},"added_dt":{"description":"Added date/time of the transaction","type":"string"},"voided_dt":{"description":"Voided date/time of the transaction","type":"string"},"staff_id":{"description":"ID of the staff performing the transaction","type":"string"},"void_staff_id":{"description":"ID of the void staff","type":"string"},"void_reason":{"description":"void reason","type":"string"},"void_reason_description":{"description":"void reason description","type":"string"},"type":{"description":"Transaction type","type":"string","enum":["cash","credit_card","house_account","gift_card","debit_card","unknown"],"example":"cash"},"status":{"description":"Status of the transaction","type":"string","enum":["auth","capture","adjust","sale","void"],"example":"auth"},"card_type":{"description":"Credit card type","type":"string","enum":["visa","mastercard","amex","discover","interac","unknown"],"example":"visa"},"card_num":{"description":"Last 4 of the credit card number","type":"string"},"card_name":{"description":"Name on the credit card","type":"string"},"house_account_id":{"description":"ID of the house account","type":"string"},"ref":{"description":"Transaction reference number","type":"string"},"amount":{"description":"Amount of the transaction, before tip","type":"number","format":"float"},"tip":{"description":"Amount of the tip","type":"number","format":"float"},"total":{"description":"Total transaction amount, after tip","type":"number","format":"float"},"additional_info":{"type":"object","properties":{"reference":{"description":"Additional reference information","type":"string"}}}}},"CashDrawer":{"type":"object","properties":{"id":{"description":"Unique ID of cash drawer","type":"string"},"opened_dt":{"description":"Open date/time of the cash drawer","type":"string","format":"date-time"},"closed_dt":{"description":"Closed date/time of the cash drawer","type":"string","format":"date-time"},"drawer_name":{"description":"Name of the cash drawer","type":"string"},"staff_id":{"description":"ID of the assigned staff","type":"string"},"virtual":{"description":"Cash drawer is a virtual server bank","type":"boolean"},"no_sale":{"description":"Number of no sales to open the drawer","type":"integer"},"starting_amount":{"description":"Starting amount when the drawer was opened","type":"number","format":"float"},"actual_cash":{"description":"Actual counted cash amount (if counted)","type":"number","format":"float"},"pay_in":{"description":"Total amount of pay ins","type":"number","format":"float"},"pay_out":{"description":"Total amount of pay outs","type":"number","format":"float"},"server_balance":{"description":"Total amount balanced to/from servers","type":"number","format":"float"},"expected_cash":{"description":"Total expected amount in the cash drawer","type":"number","format":"float"},"no_sale_events":{"description":"List of no-sale events that opened the drawer","type":"array","items":{"type":"object","properties":{"occurred_at":{"description":"Date/time when the no-sale event occurred","type":"string","format":"date-time"},"staff_id":{"description":"ID of the staff who triggered the no-sale","type":"string"},"staff_name":{"description":"Name of the staff who triggered the no-sale","type":"string"}}}}}},"CashDrawerPaidInOut":{"type":"object","properties":{"id":{"description":"Unique ID of paid in/out","type":"string"},"drawer_id":{"description":"Unique ID of the cash drawer","type":"string"},"drawer_name":{"description":"Name of the cash drawer","type":"string"},"added_dt":{"description":"Added date/time of the paid in/out","type":"string"},"daypart_id":{"description":"ID of the daypart when the paid in/out occurred","type":"string"},"staff_id":{"description":"ID of the staff performing the paid in/out","type":"string"},"paid_in_out_id":{"description":"ID of the paid in/out type","type":"string"},"amount":{"description":"Amount of the paid in/out","type":"number","format":"float"}}},"LaborPunch":{"type":"object","properties":{"id":{"description":"Unique ID of the time punch","type":"string"},"staff_id":{"description":"ID of the staff","type":"string"},"job_type_id":{"description":"ID of the staff job type","type":"string"},"punch_in_dt":{"description":"Time punch in date/time","type":"string"},"punch_out_dt":{"description":"Time punch out date/time","type":"string"},"regular_rate":{"description":"Staff regular rate","type":"number","format":"float"},"regular_hours":{"description":"Regular hours for this punch","type":"number","format":"float"},"regular_pay":{"description":"Regular pay for this punch","type":"number","format":"float"},"overtime_rate":{"description":"Staff overtime rate","type":"number","format":"float"},"overtime_hours":{"description":"Overtime hours for this punch","type":"number","format":"float"},"overtime_pay":{"description":"Overtime pay for this punch","type":"number","format":"float"},"doubletime_hours":{"description":"Doubletime hours for this punch","type":"number","format":"float"},"doubletime_pay":{"description":"Doubletime pay for this punch","type":"number","format":"float"},"total_hours":{"description":"Total hours for this punch","type":"number","format":"float"},"total_pay":{"description":"Total pay for this punch","type":"number","format":"float"},"est_system_tips":{"description":"Total system calculated tips for this punch","type":"number","format":"float"},"reported_tips":{"description":"Total tips reported by staff on punch out","type":"number","format":"float"},"breaks":{"description":"List of assigned items","type":"array","items":{"properties":{"id":{"description":"Unique ID of break","type":"string"},"break_id":{"description":"ID of the break type","type":"string"},"break_start_dt":{"description":"Break start date/time","type":"string"},"break_end_dt":{"description":"Break end date/time","type":"string"},"paid":{"description":"This break is paid","type":"boolean"}}}}}},"SetupBreakType":{"type":"object","properties":{"id":{"description":"Unique ID of break type","type":"string"},"name":{"description":"Name of break type","type":"string"},"paid":{"description":"Configured as a paid break","type":"boolean"}}},"SetupStaffUpdate":{"type":"object","properties":{"first_name":{"description":"First name of staff","type":"string","example":"John"},"last_name":{"description":"Last name of staff","type":"string","example":"Wayne"},"employee_id":{"description":"Employee ID of staff","type":"string","example":"1337"},"user_pin":{"description":"The pin required for this user to login to the system","type":"string","example":"1234"},"daily_overtime_limit":{"description":"The daily overtime limit for this user","type":"integer","example":8},"phone":{"description":"Phone number of staff","type":"string","example":"1234567890"},"salary":{"description":"Staff is paid on salary","type":"boolean","example":false},"active":{"description":"Staff is active in the system","type":"boolean","example":true},"language":{"description":"Staff Language (LCID) - If empty then defaulted to Locations Default Language","type":"string","example":"en-US"},"role_id":{"description":"Staff Permissions","type":"string","example":"cGVybWlzc2lvbnM6OTU4NA=="},"report_access_id":{"description":"Staff Report Access","type":"string","example":"cmVwb3J0QWNjZXNzOjExOTY3"},"jobTypes":{"description":"List of job types assigned to this staff member","type":"array","items":{"properties":{"job_type_id":{"description":"ID of job type","type":"string","example":"c3RhZmY6MTY5Mjcx"},"regular_rate":{"description":"Base rate of job type","type":"number","format":"float","example":10},"overtime_rate":{"description":"Overtime rate of job type","type":"number","format":"float","example":15.5}}}}}},"SetupIntegrations":{"type":"object","properties":{"id":{"description":"Unique ID of Integrations","type":"string"},"user_name":{"description":"User name","type":"string"},"password":{"description":"Password","type":"string"},"last_ticket_id":{"description":"Last ticket id","type":"string"},"type_id":{"description":"Type id","type":"integer"},"details":{"description":"Details","type":"string"},"created_dt":{"description":"Created timestamp","type":"number"},"disabled":{"description":"","type":"number"},"next_run_dt":{"description":"","type":"number"},"last_run_dt":{"description":"","type":"string"},"misc_details":{"description":"","type":"string"},"ignore_eod":{"description":"","type":"string"},"export_same_day":{"description":"","type":"string"},"integration_partner":{"description":"","type":"string"}}},"SetupDaypart":{"type":"object","properties":{"id":{"description":"Unique ID of daypart","type":"string"},"name":{"description":"Name of daypart","type":"string"},"sunday":{"description":"List of hours assigned on Sunday","type":"array","items":{"properties":{"start_hour":{"description":"Starting hour of daypart (inclusive)","type":"integer"},"end_hour":{"description":"Ending hour of daypart (not inclusive)","type":"integer"}}}},"monday":{"description":"List of hours assigned on Monday","type":"array","items":{"properties":{"start_hour":{"description":"Starting hour of daypart (inclusive)","type":"integer"},"end_hour":{"description":"Ending hour of daypart (not inclusive)","type":"integer"}}}},"tuesday":{"description":"List of hours assigned on Tuesday","type":"array","items":{"properties":{"start_hour":{"description":"Starting hour of daypart (inclusive)","type":"integer"},"end_hour":{"description":"Ending hour of daypart (not inclusive)","type":"integer"}}}},"wednesday":{"description":"List of hours assigned on Wednesday","type":"array","items":{"properties":{"start_hour":{"description":"Starting hour of daypart (inclusive)","type":"integer"},"end_hour":{"description":"Ending hour of daypart (not inclusive)","type":"integer"}}}},"thursday":{"description":"List of hours assigned on Thursday","type":"array","items":{"properties":{"start_hour":{"description":"Starting hour of daypart (inclusive)","type":"integer"},"end_hour":{"description":"Ending hour of daypart (not inclusive)","type":"integer"}}}},"friday":{"description":"List of hours assigned on Friday","type":"array","items":{"properties":{"start_hour":{"description":"Starting hour of daypart (inclusive)","type":"integer"},"end_hour":{"description":"Ending hour of daypart (not inclusive)","type":"integer"}}}},"saturday":{"description":"List of hours assigned on Saturday","type":"array","items":{"properties":{"start_hour":{"description":"Starting hour of daypart (inclusive)","type":"integer"},"end_hour":{"description":"Ending hour of daypart (not inclusive)","type":"integer"}}}}}},"SetupDisplayFormat":{"type":"object","properties":{"id":{"description":"Unique ID of display format","type":"string"},"name":{"description":"Name of display format","type":"string"}}},"SetupHouseAccount":{"type":"object","properties":{"id":{"description":"Unique ID of house account","type":"string"},"name":{"description":"Name of house account","type":"string"},"deleted":{"description":"Whether this house account has been deleted. Returned whenever the `showDeleted` query parameter is provided (either `true` or `false`); omitted when `showDeleted` is not passed.","type":"boolean"},"pos_tender_visibility":{"description":"Whether the custom tender is visible on the POS. true if 'Hide tender on POS' is unchecked (visible), false if checked (hidden). Note: the legacy `hide_tender_pos` field has been removed; use `pos_tender_visibility` going forward.","type":"boolean"},"is_active":{"description":"Whether this tender is currently enabled for use on the POS","type":"boolean"},"is_house_account":{"description":"Whether this tender is a house account with balance management, as opposed to a simple custom tender","type":"boolean"},"account_holder_name":{"description":"Account holder name","type":"string"},"account_holder_phone":{"description":"Account holder phone number","type":"string"},"account_holder_email":{"description":"Account holder email address","type":"string"},"access_code":{"description":"The card number or access code required for this tender","type":"string"},"code_required":{"description":"Whether the access code must be presented at time of tender","type":"boolean"},"manage_balance":{"description":"Whether credit limit management is active. May only be true for locations onboarded with monetary Gift.","type":"boolean"},"credit_limit":{"description":"Credit limit for this account. Always 0 when `manage_balance` is false.","type":"number","format":"float"},"allow_tips":{"description":"Whether tips are allowed for this tender","type":"boolean"},"server_cash_split":{"description":"Percentage of tip allocated to server cash. Always 0 when `allow_tips` is false.","type":"number","format":"float"},"server_payroll_split":{"description":"Percentage of tip allocated to server payroll. Always 0 when `allow_tips` is false.","type":"number","format":"float"},"merchant_split":{"description":"Percentage of tip allocated to the merchant. Always 0 when `allow_tips` is false.","type":"number","format":"float"},"allow_signature":{"description":"Whether a signature is required. Automatically true when `allow_tips` is true","type":"boolean"},"open_drawer":{"description":"Whether the cash drawer opens when this tender is used","type":"boolean"},"require_reference":{"description":"Whether a reference number is required at time of tender","type":"boolean"},"transaction_receipts":{"description":"Number of receipts to print","type":"string","enum":["0","1","2"]},"notes":{"description":"Free-text notes about this tender","type":"string"}}},"SetupHouseAccountDetail":{"type":"object","properties":{"id":{"description":"Unique ID of house account","type":"string"},"name":{"description":"Name of house account","type":"string"},"pos_tender_visibility":{"description":"Whether the custom tender is visible on the POS. true if 'Hide tender on POS' is unchecked (visible), false if checked (hidden). Note: the legacy `hide_tender_pos` field has been removed; use `pos_tender_visibility` going forward.","type":"boolean"},"is_active":{"description":"Whether this tender is currently enabled for use on the POS","type":"boolean"},"is_house_account":{"description":"Whether this tender is a house account with balance management, as opposed to a simple custom tender","type":"boolean"},"account_holder_name":{"description":"Account holder name","type":"string"},"account_holder_phone":{"description":"Account holder phone number","type":"string"},"account_holder_email":{"description":"Account holder email address","type":"string"},"access_code":{"description":"The card number or access code required for this tender","type":"string"},"code_required":{"description":"Whether the access code must be presented at time of tender","type":"boolean"},"manage_balance":{"description":"Whether credit limit management is active. May only be true for locations onboarded with monetary Gift.","type":"boolean"},"credit_limit":{"description":"Credit limit for this account. Always 0 when `manage_balance` is false.","type":"number","format":"float"},"allow_tips":{"description":"Whether tips are allowed for this tender","type":"boolean"},"server_cash_split":{"description":"Percentage of tip allocated to server cash. Always 0 when `allow_tips` is false.","type":"number","format":"float"},"server_payroll_split":{"description":"Percentage of tip allocated to server payroll. Always 0 when `allow_tips` is false.","type":"number","format":"float"},"merchant_split":{"description":"Percentage of tip allocated to the merchant. Always 0 when `allow_tips` is false.","type":"number","format":"float"},"allow_signature":{"description":"Whether a signature is required. Automatically true when `allow_tips` is true","type":"boolean"},"open_drawer":{"description":"Whether the cash drawer opens when this tender is used","type":"boolean"},"require_reference":{"description":"Whether a reference number is required at time of tender","type":"boolean"},"transaction_receipts":{"description":"Number of receipts to print","type":"string","enum":["0","1","2"]},"notes":{"description":"Free-text notes about this tender","type":"string"}}},"SetupHouseAccountCreate":{"type":"object","required":["name"],"properties":{"name":{"description":"Name of the custom tender. Required.","type":"string"},"is_active":{"description":"Whether the tender is enabled for use on the POS","type":"boolean","default":false},"pos_tender_visibility":{"description":"Whether the tender is visible on the POS (true = visible, false = hidden)","type":"boolean","default":true},"is_house_account":{"description":"Whether this is a balance-managed house account, as opposed to a simple custom tender","type":"boolean","default":false},"account_holder_name":{"description":"Account holder name","type":"string"},"account_holder_phone":{"description":"Account holder phone number","type":"string","default":""},"account_holder_email":{"description":"Account holder email address. Must be a valid email if provided.","type":"string","format":"email"},"access_code":{"description":"Card number or access code. Must be unique per location if provided.","type":"string"},"code_required":{"description":"Whether the access code must be presented at time of tender","type":"boolean","default":false},"manage_balance":{"description":"Whether credit limit management is active. May only be true for locations onboarded with monetary Gift.","type":"boolean","default":false},"credit_limit":{"description":"Credit limit for this account. Reset to 0 when `manage_balance` is false. Must not be negative.","type":"number","format":"float","minimum":0,"default":0},"allow_tips":{"description":"Whether tips are allowed. When true, the three tip splits must sum to 100 and `allow_signature` is forced to true.","type":"boolean","default":false},"server_cash_split":{"description":"Percentage of tip allocated to server cash. Only applicable when `allow_tips` is true; reset to 0 when `allow_tips` is false.","type":"number","format":"float","default":0},"server_payroll_split":{"description":"Percentage of tip allocated to server payroll. Only applicable when `allow_tips` is true; reset to 0 when `allow_tips` is false.","type":"number","format":"float","default":0},"merchant_split":{"description":"Percentage of tip allocated to the merchant. Only applicable when `allow_tips` is true; reset to 0 when `allow_tips` is false.","type":"number","format":"float","default":0},"allow_signature":{"description":"Whether a signature is required. Automatically set to true when `allow_tips` is true.","type":"boolean","default":false},"open_drawer":{"description":"Whether the cash drawer opens when this tender is used","type":"boolean","default":false},"require_reference":{"description":"Whether a reference number is required at time of tender","type":"boolean","default":false},"transaction_receipts":{"description":"Number of receipts to print","type":"string","enum":["0","1","2"],"default":"0"},"notes":{"description":"Free-text notes about this tender","type":"string"}}},"SetupHouseAccountPut":{"type":"object","description":"Full replacement payload for a custom tender (house account). `name` is required; omitted fields are reset to their default.","required":["name"],"properties":{"name":{"description":"Name of the custom tender. Required.","type":"string"},"is_active":{"description":"Whether the tender is enabled for use on the POS","type":"boolean","default":false},"pos_tender_visibility":{"description":"Whether the tender is visible on the POS (true = visible, false = hidden)","type":"boolean","default":true},"is_house_account":{"description":"Whether this is a balance-managed house account, as opposed to a simple custom tender","type":"boolean","default":false},"account_holder_name":{"description":"Account holder name","type":"string","default":""},"account_holder_phone":{"description":"Account holder phone number","type":"string","default":""},"account_holder_email":{"description":"Account holder email address. Must be a valid email if provided.","type":"string","format":"email","default":""},"access_code":{"description":"Card number or access code. Must be unique per location if provided (the record's own current code is allowed).","type":"string","default":""},"code_required":{"description":"Whether the access code must be presented at time of tender","type":"boolean","default":false},"manage_balance":{"description":"Whether credit limit management is active. May only be true for locations onboarded with monetary Gift.","type":"boolean","default":false},"credit_limit":{"description":"Credit limit for this account. Reset to 0 when `manage_balance` is false. Must not be negative.","type":"number","format":"float","minimum":0,"default":0},"allow_tips":{"description":"Whether tips are allowed. When true, the three tip splits must sum to 100 and `allow_signature` is forced to true.","type":"boolean","default":false},"server_cash_split":{"description":"Percentage of tip allocated to server cash. Only applicable when `allow_tips` is true; reset to 0 when `allow_tips` is false.","type":"number","format":"float","default":0},"server_payroll_split":{"description":"Percentage of tip allocated to server payroll. Only applicable when `allow_tips` is true; reset to 0 when `allow_tips` is false.","type":"number","format":"float","default":0},"merchant_split":{"description":"Percentage of tip allocated to the merchant. Only applicable when `allow_tips` is true; reset to 0 when `allow_tips` is false.","type":"number","format":"float","default":0},"allow_signature":{"description":"Whether a signature is required. Automatically set to true when `allow_tips` is true.","type":"boolean","default":false},"open_drawer":{"description":"Whether the cash drawer opens when this tender is used","type":"boolean","default":false},"require_reference":{"description":"Whether a reference number is required at time of tender","type":"boolean","default":false},"transaction_receipts":{"description":"Number of receipts to print","type":"string","enum":["0","1","2"],"default":"0"},"notes":{"description":"Free-text notes about this tender","type":"string","default":""}}},"SetupHouseAccountPatch":{"type":"object","description":"Partial update payload for a custom tender (house account). All fields are optional; only the fields provided are updated and any omitted field keeps its current value.","properties":{"name":{"description":"Name of the custom tender","type":"string"},"is_active":{"description":"Whether the tender is enabled for use on the POS","type":"boolean"},"pos_tender_visibility":{"description":"Whether the tender is visible on the POS (true = visible, false = hidden)","type":"boolean"},"is_house_account":{"description":"Whether this is a balance-managed house account, as opposed to a simple custom tender","type":"boolean"},"account_holder_name":{"description":"Account holder name","type":"string"},"account_holder_phone":{"description":"Account holder phone number","type":"string"},"account_holder_email":{"description":"Account holder email address. Must be a valid email if provided, or an empty string to clear it.","type":"string","format":"email"},"access_code":{"description":"Card number or access code. Must be unique per location if provided (the record's own current code is allowed).","type":"string"},"code_required":{"description":"Whether the access code must be presented at time of tender","type":"boolean"},"manage_balance":{"description":"Whether credit limit management is active. May only be true for locations onboarded with monetary Gift. When set to false, `credit_limit` is reset to 0.","type":"boolean"},"credit_limit":{"description":"Credit limit for this account. Only applicable when `manage_balance` is active. Must not be negative.","type":"number","format":"float","minimum":0},"allow_tips":{"description":"Whether tips are allowed. When set to true, the three tip splits must sum to 100 and `allow_signature` is forced to true. When set to false, the tip splits are reset to 0.","type":"boolean"},"server_cash_split":{"description":"Percentage of tip allocated to server cash. Only applicable when `allow_tips` is true.","type":"number","format":"float"},"server_payroll_split":{"description":"Percentage of tip allocated to server payroll. Only applicable when `allow_tips` is true.","type":"number","format":"float"},"merchant_split":{"description":"Percentage of tip allocated to the merchant. Only applicable when `allow_tips` is true.","type":"number","format":"float"},"allow_signature":{"description":"Whether a signature is required. Automatically set to true when `allow_tips` is true.","type":"boolean"},"open_drawer":{"description":"Whether the cash drawer opens when this tender is used","type":"boolean"},"require_reference":{"description":"Whether a reference number is required at time of tender","type":"boolean"},"transaction_receipts":{"description":"Number of receipts to print","type":"string","enum":["0","1","2"]},"notes":{"description":"Free-text notes about this tender","type":"string"}}},"SetupJobType":{"type":"object","properties":{"id":{"description":"Unique ID of job type","type":"string"},"name":{"description":"Name of job type","type":"string"},"labor_category_id":{"description":"ID of labor category","type":"string"},"time_clock_only":{"description":"If true, this role has no POS access and is used for time/labor tracking only","type":"boolean"},"require_tips":{"description":"Whether tip entry is required at checkout for this role","type":"boolean"},"hide_ticket_status":{"description":"Whether the ticket status indicator is hidden for this role on the floor plan","type":"boolean"},"save_no_connection":{"description":"Whether the POS saves orders when the device is offline","type":"boolean"},"ticket_access":{"description":"Controls whether this role can see and interact with other staff members' tickets","type":"string","enum":["none","view_only","edit"]},"cash_transactions_mode":{"description":"Defines the cash management model for this role","type":"string","enum":["none","server_banking","cash_drawer"]},"server_checkout_report":{"description":"Controls when the server checkout report prints for this role","type":"string","enum":["always","prompt","never"]},"tender_cash":{"description":"Which drawer(s) this role can tender cash to","type":"string","enum":["none","assigned_drawer","any_drawer","bank_only"]},"void_cash":{"description":"Which drawer(s) this role can void cash transactions on","type":"string","enum":["none","assigned_drawer","any_drawer","bank_only"]},"pay_in_out":{"description":"Which drawer(s) this role can perform cash pay ins/outs on","type":"string","enum":["none","assigned_drawer","any_drawer","bank_only"]},"no_sale":{"description":"Which drawer(s) this role can open without a transaction","type":"string","enum":["none","assigned_drawer","any_drawer","bank_only"]},"server_balance":{"description":"Which drawer(s) this role tracks a server cash balance for","type":"string","enum":["none","assigned_drawer","any_drawer","bank_only"]},"ignore_formats":{"description":"Display format IDs this role ignores","type":"array","items":{"type":"object","properties":{"id":{"description":"GraphID of display format","type":"string"}}}},"assigned_staff":{"description":"Staff assigned to this job type with pay rates","type":"array","items":{"type":"object","properties":{"staff_id":{"description":"GraphID of staff member","type":"string"},"regular_rate":{"type":"number","format":"float"},"overtime_rate":{"type":"number","format":"float"}}}},"deleted":{"description":"Whether the job type is deleted (only returned when showDeleted is true)","type":"boolean"}}},"SetupJobTypeCreate":{"type":"object","required":["name"],"properties":{"name":{"description":"Name of job type","type":"string","example":"Server"},"labor_category_id":{"description":"GraphID of labor category","type":"string","example":"bGFib3JDYXRlZ29yeTo0ODc="},"time_clock_only":{"type":"boolean","default":false},"require_tips":{"type":"boolean","default":false},"hide_ticket_status":{"type":"boolean","default":false},"save_no_connection":{"type":"boolean","default":false},"ticket_access":{"type":"string","enum":["none","view_only","edit"],"default":"none"},"cash_transactions_mode":{"type":"string","enum":["none","server_banking","cash_drawer"],"default":"none"},"server_checkout_report":{"type":"string","enum":["always","prompt","never"],"default":"always"},"tender_cash":{"type":"string","enum":["none","assigned_drawer","any_drawer","bank_only"]},"void_cash":{"type":"string","enum":["none","assigned_drawer","any_drawer","bank_only"]},"pay_in_out":{"type":"string","enum":["none","assigned_drawer","any_drawer","bank_only"]},"no_sale":{"type":"string","enum":["none","assigned_drawer","any_drawer","bank_only"]},"server_balance":{"type":"string","enum":["none","assigned_drawer","any_drawer","bank_only"]},"ignore_formats":{"description":"Display formats hidden for this job type","type":"array","items":{"type":"object","properties":{"id":{"description":"GraphID of display format","type":"string","example":"ZGlzcGxheUZvcm1hdDoxMjM="}}}},"assigned_staff":{"description":"Staff members assigned to this job type","type":"array","items":{"type":"object","properties":{"staff_id":{"description":"GraphID of staff member","type":"string","example":"c3RhZmY6MTY5Mjcx"},"regular_rate":{"type":"number","format":"float","example":15},"overtime_rate":{"type":"number","format":"float","example":22.5}}}}}},"SetupJobTypePatch":{"type":"object","description":"Partial update payload for a job type. All fields are optional; omitted fields remain unchanged.","properties":{"name":{"description":"Name of job type","type":"string","example":"Lead Server"},"labor_category_id":{"description":"GraphID of labor category","type":"string","example":"bGFib3JDYXRlZ29yeTo0ODc="},"time_clock_only":{"type":"boolean"},"require_tips":{"type":"boolean"},"hide_ticket_status":{"type":"boolean"},"save_no_connection":{"type":"boolean"},"ticket_access":{"type":"string","enum":["none","view_only","edit"]},"cash_transactions_mode":{"type":"string","enum":["none","server_banking","cash_drawer"]},"server_checkout_report":{"type":"string","enum":["always","prompt","never"]},"tender_cash":{"type":"string","enum":["none","assigned_drawer","any_drawer","bank_only"]},"void_cash":{"type":"string","enum":["none","assigned_drawer","any_drawer","bank_only"]},"pay_in_out":{"type":"string","enum":["none","assigned_drawer","any_drawer","bank_only"]},"no_sale":{"type":"string","enum":["none","assigned_drawer","any_drawer","bank_only"]},"server_balance":{"type":"string","enum":["none","assigned_drawer","any_drawer","bank_only"]},"ignore_formats":{"description":"Display formats hidden for this job type. Replaces the full existing set when provided.","type":"array","items":{"type":"object","properties":{"id":{"description":"GraphID of display format","type":"string","example":"ZGlzcGxheUZvcm1hdDoxMjM="}}}},"assigned_staff":{"description":"Staff members assigned to this job type. Replaces the full existing set when provided.","type":"array","items":{"type":"object","properties":{"staff_id":{"description":"GraphID of staff member","type":"string","example":"c3RhZmY6MTY5Mjcx"},"regular_rate":{"type":"number","format":"float","example":16.5},"overtime_rate":{"type":"number","format":"float","example":24.75}}}}}},"SetupJobTypeDetail":{"type":"object","properties":{"id":{"description":"Unique ID of job type","type":"string","example":"am9iVHlwZTo3MTUx"},"name":{"type":"string","example":"Server"},"labor_category_id":{"type":"string","example":"bGFib3JDYXRlZ29yeTo0ODc="},"time_clock_only":{"type":"boolean"},"require_tips":{"type":"boolean"},"hide_ticket_status":{"type":"boolean"},"save_no_connection":{"type":"boolean"},"ticket_access":{"type":"string","enum":["none","view_only","edit"]},"cash_transactions_mode":{"type":"string","enum":["none","server_banking","cash_drawer"]},"server_checkout_report":{"type":"string","enum":["always","prompt","never"]},"tender_cash":{"type":"string","enum":["none","assigned_drawer","any_drawer","bank_only"]},"void_cash":{"type":"string","enum":["none","assigned_drawer","any_drawer","bank_only"]},"pay_in_out":{"type":"string","enum":["none","assigned_drawer","any_drawer","bank_only"]},"no_sale":{"type":"string","enum":["none","assigned_drawer","any_drawer","bank_only"]},"server_balance":{"type":"string","enum":["none","assigned_drawer","any_drawer","bank_only"]},"ignore_formats":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"}}}},"assigned_staff":{"type":"array","items":{"type":"object","properties":{"staff_id":{"type":"string"},"regular_rate":{"type":"number","format":"float"},"overtime_rate":{"type":"number","format":"float"}}}}}},"SetupLaborCategory":{"type":"object","properties":{"id":{"description":"Base64-encoded GraphID (key: laborCategory)","type":"string"},"name":{"description":"Name of labor category","type":"string"},"fixed_cost":{"description":"Fixed cost of labor category","type":"number","format":"float"},"assigned_job_types":{"description":"Job types assigned to this labor category","type":"array","items":{"type":"object","properties":{"job_type_id":{"description":"Base64-encoded GraphID (key: jobType)","type":"string"}}}}}},"SetupLaborCategoryDetail":{"type":"object","properties":{"id":{"description":"Base64-encoded GraphID (key: laborCategory)","type":"string","example":"bGFib3JDYXRlZ29yeTo0ODg="},"name":{"description":"Name of labor category","type":"string","example":"BOH"},"fixed_cost":{"description":"Fixed cost of labor category","type":"number","format":"float","minimum":0,"example":0},"assigned_job_types":{"description":"Job types assigned to this labor category","type":"array","items":{"type":"object","properties":{"job_type_id":{"description":"Base64-encoded GraphID (key: jobType)","type":"string"}}}}}},"SetupLaborCategoryCreate":{"type":"object","required":["name"],"properties":{"name":{"description":"Name of labor category","type":"string","minLength":1,"example":"BOH"},"fixed_cost":{"description":"Fixed cost of labor category. Defaults to 0 if omitted.","type":"number","format":"float","minimum":0,"example":0},"assigned_job_types":{"description":"Job types to assign to this labor category. Defaults to [] if omitted.","type":"array","items":{"type":"object","properties":{"job_type_id":{"description":"Base64-encoded GraphID (key: jobType)","type":"string","example":"am9iVHlwZTo3MTUx"}}}}}},"SetupLaborCategoryPatch":{"type":"object","properties":{"name":{"description":"Name of labor category. Must not be empty if provided.","type":"string","minLength":1,"example":"BOH"},"fixed_cost":{"description":"Fixed cost of labor category. Must be >= 0 if provided.","type":"number","format":"float","minimum":0,"example":0},"assigned_job_types":{"description":"Job types to assign to this labor category","type":"array","items":{"type":"object","properties":{"job_type_id":{"description":"Base64-encoded GraphID (key: jobType)","type":"string","example":"am9iVHlwZTo3MTUx"}}}}}},"SetupPaidInOutType":{"type":"object","properties":{"id":{"description":"Base64-encoded GraphID (key: paidInOutType)","type":"string","example":"cGFpZEluT3V0VHlwZToyMjY2"},"name":{"description":"Name of paid in/out type","type":"string","example":"Grocery Run"}}},"SetupPrinter":{"type":"object","properties":{"id":{"description":"Unique ID of printer","type":"string"},"name":{"description":"Name of printer","type":"string"},"ip_address":{"description":"IP address of printer","type":"string"},"shared":{"description":"Printer will receive jobs from the server spool","type":"boolean"},"split_drawers":{"description":"Printer connected to two cash drawers","type":"boolean"},"buzzer":{"description":"Printer connected to a buzzer","type":"boolean"},"brand":{"description":"Brand of printer","type":"string","enum":["star","epson","toshiba"],"example":"star"},"series":{"description":"Model of printer","type":"string","enum":["TSP Thermal (Legacy)","SP (Impact)","mC-Print (Thermal)","TM-T20","TM-T88 (IV and above)","TM-m30","TM-U220 (impact)","TM-L90 (legacy)","TM-L100","HSP100 (Thermal)","HSP150 (Thermal)"],"example":"HSP150 (Thermal)"}}},"SetupRoom":{"type":"object","properties":{"id":{"description":"Unique ID of room","type":"string"},"name":{"description":"Name of room","type":"string"},"type":{"description":"Room layout type","type":"string","enum":["tab","table_layout","delivery"],"example":"tab"},"revenue_center_id":{"description":"The encoded ID of the revenue center associated with the room","type":"string"},"surcharge_amount":{"description":"Surcharge for tickets in this room","type":"number","format":"float"},"surcharge_amount_type":{"description":"Surcharge configured as dollar or percent","type":"string","enum":["dollar","percent"],"example":"dollar"},"tables":{"description":"List of tables","type":"array","items":{"type":"object","properties":{"table_id":{"description":"Unique ID of table","type":"string"},"table_name":{"description":"Name of the table","type":"string"}}}},"taxes":{"description":"List of taxes applicable to this room","type":"array","items":{"type":"object","properties":{"id":{"description":"unique identifier for the tax","type":"string"},"name":{"description":"name of tax","type":"string"},"rate":{"description":"tax percentage rate applied to the room","type":"number","format":"float"},"override":{"description":"indicates if the tax rate is overridden for this from","type":"boolean"},"tags":{"description":"list of tax-related tags that categorize the tax type","type":"array","items":{"type":"object","properties":{"id":{"description":"Unique ID of the tag","type":"string"},"name":{"description":"Name of the tag","type":"string"}}}}}}},"discounts":{"description":"List of discounts","type":"array","items":{"type":"object","properties":{"id":{"description":"Unique ID of discount","type":"string"},"name":{"description":"Name of the discount","type":"string"}}}},"adjustments":{"description":"List of adjustments","type":"array","items":{"type":"object","properties":{"id":{"description":"Unique ID of adjustment","type":"string"},"name":{"description":"Name of the adjustment","type":"string"}}}},"pricing_rules":{"description":"List of pricing rules for this room","type":"array","items":{"type":"object","properties":{"id":{"description":"base64-encoded identifier of the pricing rule","type":"string"},"name":{"description":"Name of the pricing rule","type":"string"},"short_identifier":{"description":"Optional short reference label","type":"string"},"apply_post_tax":{"description":"Whether the rule is applied after tax","type":"boolean"},"start_date":{"description":"Optional start date for the pricing rule","type":"string","format":"YYYY-MM-DD"},"end_date":{"description":"Optional end date for the pricing rule","type":"string","format":"YYYY-MM-DD"},"available_online":{"description":"Whether the pricing rule is used in online ordering","type":"boolean"},"schedule":{"description":"Active time ranges, per day","type":"array","items":{"type":"object","properties":{"day":{"description":"Day of the week the rule applies","type":"string","enum":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"example":"Monday"},"start_time":{"description":"Start time for the rule","type":"string","format":"time"},"end_time":{"description":"End time for the rule","type":"string","format":"time"}}}},"pricing":{"description":"One or more pricing adjustments","type":"array","items":{"type":"object","properties":{"target_type":{"description":"One of “tag/attribute”, “group”, “section”, “item”, or “size”","type":"string","enum":["tag/attribute","group","section","item","size"],"example":"item"},"target_id":{"description":"base64-encoded id of the target","type":"string"},"target_name":{"description":"Name of the target","type":"string"},"adjustment_type":{"description":"“percent_adjust”, “dollar-adjust”, or “force_price”","type":"string","enum":["percent_adjust","dollar-adjust","force_price"],"example":"percent_adjust"},"amount":{"description":"The adjustment value, may be negative","type":"number","format":"float"},"affects_modifiers":{"description":"Optional - not applicable for “dollar_adjust” adjustment type","type":"boolean"},"size":{"description":"The size associated with the pricing","type":"object","properties":{"id":{"description":"Base64-encoded id of the size","type":"string"},"name":{"description":"Name of the size","type":"string"}}}}}}}}}}},"SetupScheduledShift":{"type":"object","properties":{"id":{"description":"Unique ID of shift","type":"string"},"staff_id":{"description":"ID of staff","type":"string"},"job_type_id":{"description":"ID of job type","type":"string"},"business_date":{"description":"Business date of the shift","type":"string","format":"date"},"start_dt":{"description":"Start date/time of the shift","type":"string","format":"date-time"},"end_dt":{"description":"End date/time of the shift","type":"string","format":"date-time"}}},"SetupScheduledShiftCreate":{"type":"object","required":["staff_id","job_type_id","business_date","start_dt","end_dt"],"properties":{"staff_id":{"description":"ID of staff","type":"string"},"job_type_id":{"description":"ID of job type","type":"string"},"business_date":{"description":"Business date of the shift","type":"string","format":"date"},"start_dt":{"description":"Start date/time of the shift","type":"string","format":"date-time"},"end_dt":{"description":"End date/time of the shift","type":"string","format":"date-time"}}},"SetupSettings":{"type":"object","properties":{"parent_account_number":{"description":"Unique ID of parent account","type":"string"},"parent_account_name":{"description":"Name of parent account","type":"string"},"account_number":{"description":"Unique ID of location","type":"string"},"reseller":{"description":"Name of the reseller associated with the location. Returns null when the location has no reseller.","type":"string"},"name":{"description":"Name of location","type":"string"},"address":{"description":"Address of location","type":"string"},"city":{"description":"City of location","type":"string"},"state":{"description":"State of location","type":"string"},"zip":{"description":"Zip of location","type":"string"},"timezone":{"description":"Timezone of location","type":"string"},"phone":{"description":"Phone number of location","type":"string"},"end_of_day":{"description":"End of day time for reporting","type":"string"}}},"UpdateSetupSettings":{"type":"object","properties":{"name":{"description":"Name of location","type":"string","example":"Cafe MB"},"address":{"description":"Address of location","type":"string","example":"555 W Beech St, Ste 222"},"city":{"description":"City of location","type":"string","example":"San Diego"},"state":{"description":"State of location","type":"string","example":"CA"},"zip":{"description":"Zip of location","type":"string","example":"92101"},"phone":{"description":"Phone number of location","type":"string","example":"4803518800"}}},"SetupStaff":{"type":"object","properties":{"id":{"description":"Unique ID of staff","type":"string","example":"c3RhZmY6MTY5Mjcx"},"first_name":{"description":"First name of staff","type":"string","example":"John"},"last_name":{"description":"Last name of staff","type":"string","example":"Wayne"},"employee_id":{"description":"Employee ID of staff","type":"string","example":"1337"},"user_pin":{"description":"The pin required for this user to login to the system. If omitted, negative PKID would be returned.","type":"string","example":"1234"},"daily_overtime_limit":{"description":"The daily overtime limit for this user","type":"integer","example":8},"phone":{"description":"Phone number of staff","type":"string","example":"1234567890"},"salary":{"description":"Staff is paid on salary","type":"boolean","example":false},"active":{"description":"Staff is active in the system","type":"boolean","example":true},"language":{"description":"Staff Language (LCID) - If empty then defaulted to Locations Default Language","type":"string","enum":["","en-US","fr-CA","es-US"],"example":"en-US"},"role_id":{"description":"Staff Permissions","type":"string","example":"cGVybWlzc2lvbnM6OTU4NA=="},"report_access_id":{"description":"Staff Report Access","type":"string","example":"cmVwb3J0QWNjZXNzOjExOTY3"},"jobTypes":{"description":"List of job types assigned to this staff member","type":"array","items":{"properties":{"job_type_id":{"description":"ID of job type","type":"string","example":"am9iVHlwZTo3MTUx"},"regular_rate":{"description":"Base rate of job type","type":"number","format":"float","example":11},"overtime_rate":{"description":"Overtime rate of job type","type":"number","format":"float","example":20}}}},"created_when":{"description":"Timestamp (ISO 8601) when the staff member was created. Returned when creating a staff member.","type":"string","format":"date-time","example":"2026-09-10T12:34:56.000Z"}}},"SetupStaffBase":{"type":"object","properties":{"id":{"description":"Unique ID of staff","type":"string","example":"c3RhZmY6MTY5Mjcx"},"first_name":{"description":"First name of staff","type":"string","example":"John"},"last_name":{"description":"Last name of staff","type":"string","example":"Wayne"},"employee_id":{"description":"Employee ID of staff","type":"string","example":"1337"},"user_pin":{"description":"The pin required for this user to login to the system. If omitted, negative PKID would be returned.","type":"string","example":"1234"},"daily_overtime_limit":{"description":"The daily overtime limit for this user","type":"integer","example":8},"phone":{"description":"Phone number of staff","type":"string","example":"1234567890"},"salary":{"description":"Staff is paid on salary","type":"boolean","example":false},"active":{"description":"Staff is active in the system","type":"boolean","example":true},"language":{"description":"Staff Language (LCID) - If empty then defaulted to Locations Default Language","type":"string","enum":["","en-US","fr-CA","es-US"],"example":"en-US"},"role_id":{"description":"Staff Permissions","type":"string","example":"cGVybWlzc2lvbnM6OTU4NA=="},"report_access_id":{"description":"Staff Report Access","type":"string","example":"cmVwb3J0QWNjZXNzOjExOTY3"},"jobTypes":{"description":"List of job types assigned to this staff member","type":"array","items":{"properties":{"job_type_id":{"description":"ID of job type","type":"string","example":"am9iVHlwZTo3MTUx"},"regular_rate":{"description":"Base rate of job type","type":"number","format":"float","example":11},"overtime_rate":{"description":"Overtime rate of job type","type":"number","format":"float","example":20}}}}}},"SetupStaffCreate":{"type":"object","additionalProperties":false,"required":["first_name","jobTypes"],"properties":{"first_name":{"description":"First name of staff","type":"string","minLength":1,"example":"John"},"last_name":{"description":"Last name of staff","type":"string","example":"Wayne"},"employee_id":{"description":"Employee ID of staff","type":"string","example":"1337"},"user_pin":{"description":"The pin required for this user to login to the system. If omitted, negative PKID would be returned.","type":"string","maxLength":8,"example":"1234"},"daily_overtime_limit":{"description":"The daily overtime limit for this user","type":"integer","minimum":0,"maximum":99,"example":8},"phone":{"description":"Phone number of staff","type":"string","example":"1234567890"},"salary":{"description":"Staff is paid on salary","type":"boolean","example":false},"active":{"description":"Staff is active in the system","type":"boolean","example":true},"language":{"description":"Staff Language (LCID) - If empty then defaulted to Locations Default Language","type":"string","enum":["","en-US","fr-CA","es-US"],"example":"en-US"},"role_id":{"description":"Staff Permissions","type":"string","example":"cGVybWlzc2lvbnM6OTU4NA=="},"report_access_id":{"description":"Staff Report Access","type":"string","example":"cmVwb3J0QWNjZXNzOjExOTY3"},"jobTypes":{"description":"List of job types assigned to this staff member. At least one entry is required.","type":"array","minItems":1,"items":{"additionalProperties":false,"required":["job_type_id","regular_rate","overtime_rate"],"properties":{"job_type_id":{"description":"ID of job type","type":"string","example":"am9iVHlwZTo3MTUx"},"regular_rate":{"description":"Base rate of job type","type":"number","format":"float","minimum":0,"example":11},"overtime_rate":{"description":"Overtime rate of job type","type":"number","format":"float","minimum":0,"example":20}}}}}},"SetupStaffPutResponse":{"allOf":[{"$ref":"#/components/schemas/SetupStaff"},{"type":"object","properties":{"updated_when":{"description":"Timestamp generated by the API after updating the staff member.","type":"string","format":"date-time","example":"2026-09-14T12:00:00.000Z"}}}]},"SetupStaffGet":{"allOf":[{"$ref":"#/components/schemas/SetupStaffBase"},{"type":"object","properties":{"deleted":{"description":"Whether this staff member has been deleted. Only returned by GET /v2/setup/staff when the showDeleted query parameter is provided.","type":"boolean"}}}]},"SetupTablet":{"type":"object","properties":{"id":{"description":"Unique ID of authorized tablet","type":"string"},"name":{"description":"Name of authorized tablet","type":"string"}}},"SetupPermissionsCreate":{"allOf":[{"$ref":"#/components/schemas/SetupPermissionsBase"},{"$ref":"#/components/schemas/SetupPermissionsExtra"},{"type":"object","required":["name"]}]},"SetupPermissionsPatch":{"allOf":[{"$ref":"#/components/schemas/SetupPermissionsBase"},{"$ref":"#/components/schemas/SetupPermissionsExtra"}]},"SetupPermissions":{"allOf":[{"type":"object","properties":{"id":{"description":"Unique ID of permission","type":"string"}}},{"$ref":"#/components/schemas/SetupPermissionsBase"},{"$ref":"#/components/schemas/SetupPermissionsExtra"}]},"SetupPermissionsBase":{"type":"object","properties":{"name":{"description":"Name of permission","type":"string"},"super_user":{"description":"Allows access to all current and future permissions","type":"boolean"},"order_void":{"description":"Allows access to void orders","type":"boolean"},"order_discount":{"description":"Allows access to add all adjustments to orders","type":"boolean"},"order_bill_house_account":{"description":"Allows access to charge a bill to a house account","type":"boolean"},"order_item_delete":{"description":"Allows access to remove items from an order","type":"boolean"},"manager_reports":{"description":"Allows access to manager reports","type":"boolean"},"manager_assign_cash_drawer":{"description":"Allows access to assign cash drawers to staff members","type":"boolean"},"manager_close_cash_drawer":{"description":"Allows access to close cash drawers","type":"boolean"},"manager_time_punch":{"description":"Allows access to view and edit staff time punches","type":"boolean"},"manager_devices":{"description":"Allows access to manage POS devices","type":"boolean"},"manager_printers":{"description":"Allows access to manage printers","type":"boolean"},"manager_screen_saver":{"description":"Allows access to change the auto logout process","type":"boolean"},"manager_daily_close":{"description":"Allows access to the daily close options","type":"boolean"},"closed_sections":{"description":"Allows access to view closed groups","type":"boolean"},"order_void_transaction":{"description":"Allows access to void transactions","type":"boolean"},"move_item":{"description":"Allows access to move items from one ticket to another","type":"boolean"},"reprint":{"description":"Allows access to reprint receipts","type":"boolean"},"change_server":{"description":"Allows access to change the server assigned to a ticket","type":"boolean"},"change_table":{"description":"Allows access to change the table a ticket is assigned to","type":"boolean"},"show_expected_cash":{"description":"Allows access to view the expected cash of a cash drawer","type":"boolean"},"stock_item":{"description":"Allows access to '86' or edit the available stock of any particular menu item","type":"boolean"},"online_order":{"description":"Allows access to change the prep time and availability of online ordering from within the app","type":"boolean"},"manager_comp":{"description":"Allows access to add all discounts to orders","type":"boolean"},"pay_in_outs":{"description":"Allows any staff member of this permission type perform pay ins and outs through his/her server bank or assigned cash drawer","type":"boolean"},"no_sale":{"description":"Allows access to perform no sale transactions","type":"boolean"},"offline_mode":{"description":"Allows any staff member of this permission type to forcibly enable offline, optimistic credit card processing at the device level","type":"boolean"},"force_send":{"description":"Allows any staff member of this permission type to forcibly send a ticket should a credit card additional auth fail","type":"boolean"},"refund":{"description":"Allows access to create refunds","type":"boolean"},"assign_pin":{"description":"Allows any staff member of this permission to assign PINs and user cards to other staff from the POS","type":"boolean"},"apply_rewards":{"description":"Allows access to add guest loyalty rewards","type":"boolean"},"reprint_kitchen":{"description":"Allows access to reprint kitchen slips","type":"boolean"},"training_mode":{"description":"Allows any staff member of this permission to put a tablet into training mode","type":"boolean"},"no_tax":{"description":"Allows access to use the 'No Tax' option","type":"boolean"},"misc_item":{"description":"Allows access to ring up miscellaneous (open) menu items","type":"boolean"},"manage_tip_pools":{"description":"Allows access to distribute tips from a tip pool to other staff members","type":"boolean"},"manual_tip_outs":{"description":"Allows access to manually tip out any custom amount, outside of the configured Tip Out Types","type":"boolean"},"unscheduled_clock_in":{"description":"Allow clocking in early or without a scheduled shift","type":"boolean"},"split_check":{"description":"Allows for creating new split checks","type":"boolean"},"transfer_credit_card":{"description":"Allows for copying a credit card token from one ticket to another","type":"boolean"},"can_discard_changes":{"description":"Allows for discarding of entire order tickets and single items","type":"boolean"},"enter_continuity_mode":{"description":"Allows user to place POS in Continuity Mode when unable to communicate with MEV device","type":"boolean"}}},"SetupPermissionsExtra":{"type":"object","properties":{"logout_pos":{"description":"Allows access to log out of the POS","type":"boolean"},"large_tip_approval":{"description":"Allows access to approve large tips","type":"boolean"},"pause_third_party_ordering":{"description":"Allows access to pause third-party ordering","type":"boolean"},"assigned_discounts":{"description":"Specific discounts this role can apply. Each `discount_id` must reference an existing discount for the location.","type":"array","items":{"type":"object","properties":{"discount_id":{"description":"Unique ID of the discount","type":"string"}}}},"assigned_adjustments":{"description":"Specific adjustments this role can apply. Each `adjustment_id` must reference an existing adjustment for the location.","type":"array","items":{"type":"object","properties":{"adjustment_id":{"description":"Unique ID of the adjustment","type":"string"}}}},"assigned_staff":{"description":"Staff assigned to this role. Each `staff_id` must reference an existing staff member for the location.","type":"array","items":{"type":"object","properties":{"staff_id":{"description":"Unique ID of the staff member","type":"string"}}}}}},"SetupPermissionsGet":{"allOf":[{"type":"object","properties":{"id":{"description":"Unique ID of permission","type":"string"}}},{"$ref":"#/components/schemas/SetupPermissionsBase"},{"$ref":"#/components/schemas/SetupPermissionsExtra"}]},"CreateReportAccess":{"type":"object","required":["name"],"properties":{"name":{"description":"Name of report access","type":"string","example":"Manager Reports"},"sales_reports":{"description":"Whether the user has access to sales reports","type":"boolean"},"labor_reports":{"description":"Whether the user has access to labor reports","type":"boolean"},"payroll_reports":{"description":"Whether the user has access to payroll reports","type":"boolean"},"loyalty_reports":{"description":"Whether the user has access to loyalty reports","type":"boolean"},"gift_reports":{"description":"Whether the user has access to gift card reports","type":"boolean"},"batch_cc_reports":{"description":"Whether the user has access to batch credit card reports","type":"boolean"},"assigned_staff":{"description":"Staff assigned to this report access","type":"array","items":{"type":"object","properties":{"staff_id":{"description":"GraphID of staff member","type":"string","example":"c3RhZmY6MTI2MDIwMg=="}}}}}},"PatchReportAccess":{"type":"object","properties":{"name":{"description":"Name of report access","type":"string","example":"Manager Reports"},"sales_reports":{"description":"Whether the user has access to sales reports","type":"boolean","example":true},"labor_reports":{"description":"Whether the user has access to labor reports","type":"boolean","example":true},"payroll_reports":{"description":"Whether the user has access to payroll reports","type":"boolean","example":true},"loyalty_reports":{"description":"Whether the user has access to loyalty reports","type":"boolean","example":true},"gift_reports":{"description":"Whether the user has access to gift card reports","type":"boolean","example":true},"batch_cc_reports":{"description":"Whether the user has access to batch credit card reports","type":"boolean","example":true},"assigned_staff":{"description":"Staff assigned to this report access","type":"array","items":{"type":"object","required":["staff_id"],"properties":{"staff_id":{"description":"GraphID of staff member","type":"string","example":"c3RhZmY6MTI2MDIwMg=="}}}}}},"PutReportAccess":{"type":"object","required":["name"],"properties":{"name":{"description":"Name of report access","type":"string","example":"Manager Reports"},"sales_reports":{"description":"Whether the user has access to sales reports","type":"boolean","example":true},"labor_reports":{"description":"Whether the user has access to labor reports","type":"boolean","example":true},"payroll_reports":{"description":"Whether the user has access to payroll reports","type":"boolean","example":true},"loyalty_reports":{"description":"Whether the user has access to loyalty reports","type":"boolean","example":true},"gift_reports":{"description":"Whether the user has access to gift card reports","type":"boolean","example":true},"batch_cc_reports":{"description":"Whether the user has access to batch credit card reports","type":"boolean","example":true},"assigned_staff":{"description":"Staff assigned to this report access","type":"array","items":{"type":"object","required":["staff_id"],"properties":{"staff_id":{"description":"GraphID of staff member","type":"string","example":"c3RhZmY6MTI2MDIwMg=="}}}}}},"ReportAccessDetail":{"type":"object","properties":{"id":{"description":"GraphID of report access","type":"string"},"name":{"description":"Name of report access","type":"string"},"sales_reports":{"description":"Whether the user has access to sales reports","type":"boolean"},"labor_reports":{"description":"Whether the user has access to labor reports","type":"boolean"},"payroll_reports":{"description":"Whether the user has access to payroll reports","type":"boolean"},"loyalty_reports":{"description":"Whether the user has access to loyalty reports","type":"boolean"},"gift_reports":{"description":"Whether the user has access to gift card reports","type":"boolean"},"batch_cc_reports":{"description":"Whether the user has access to batch credit card reports","type":"boolean"},"assigned_staff":{"description":"Staff members assigned to this report access role","type":"array","items":{"type":"object","properties":{"staff_id":{"description":"Unique GraphID of the staff member","type":"string"}}}}}},"SetupPaidInOutTypeCreate":{"type":"object","required":["name"],"properties":{"name":{"description":"Name of paid in out type","type":"string","minLength":1,"example":"Grocery Run"}}},"SetupPaidInOutTypePatch":{"type":"object","properties":{"name":{"description":"Name of paid in/out type. Must not be empty if provided.","type":"string","minLength":1,"example":"Bank Deposit"}}},"StockItem":{"type":"object","properties":{"stock":{"type":"number"}}},"EnabledEvent":{"title":"EnabledEvent","type":"string","description":"Enabled webhook event. `*` will subscribe a registered endpoint to all possible events. `ticket.openClose` is DEPRECATED — use `ticket.all` instead.","enum":["*","labor.punch","setup.scheduledShifts","item.stock","ticket.all","setup.staff","menu.published"],"deprecated":true},"EnabledEvents":{"description":"List of events to enable for this endpoint.","type":"array","items":{"$ref":"#/components/schemas/EnabledEvent"}},"WebhookEndpointPost":{"type":"object","required":["url","enabled_events"],"properties":{"id":{"description":"Heartland Webhook Endpoint reference ID.","type":"string"},"url":{"description":"The URL for the webhook endpoint.","type":"string"},"enabled_events":{"$ref":"#/components/schemas/EnabledEvents"}}},"WebhookEndpointResponsePut":{"type":"object","properties":{"id":{"description":"Heartland Webhook Endpoint reference ID.","type":"string"},"url":{"description":"The URL for the webhook endpoint.","type":"string"},"enabled_events":{"$ref":"#/components/schemas/EnabledEvents"}}},"WebhookEndpoint":{"type":"object","required":["url","enabled_events"],"properties":{"url":{"description":"The URL for the webhook endpoint.","type":"string"},"enabled_events":{"$ref":"#/components/schemas/EnabledEvents"}}},"WebhookAuthorizationPost":{"type":"object","required":["token"],"properties":{"token":{"description":"Token to authenticate webhook requests from Heartland Restaurant.","type":"string"}}},"FailedWebhookEvent":{"type":"object","properties":{"event_id":{"description":"Webhook event identifier.","type":"string"},"location_number":{"description":"Heartland Restaurant identifier for a location.","type":"string"},"object":{"description":"Description of request type.","type":"string"},"created":{"description":"Unix timestamp for when event was created dispatched to registered endpoint.","type":"number"},"event_created":{"description":"Unix timestamp of when the event was created.","type":"number"},"type":{"description":"The event type of this failed webhook delivery, such as labor.punch or ticket.all.","type":"string","example":"labor.punch"},"data":{"description":"Data dependent on the type of event this corresponds to.","type":"object"}}}},"requestBodies":{"TimePunch":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimePunch"}}},"required":true},"CreateMenuTax":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMenuTax"}}},"required":true},"CreateMenuAttribute":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMenuAttribute"}}},"required":true},"UpdateMenuAttribute":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMenuAttribute"}}},"required":true},"CreateMenuAdjustment":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMenuAdjustment"}}},"required":true},"CreateMenuContextItem":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMenuContextItem"}}},"required":true},"CreateMenuDiscount":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMenuDiscount"},"examples":{"example":{"value":{"name":"10% Off Appetizers","tax_exempt":true,"open_amount":false,"affect_modifiers":true,"amount":10,"amount_type":"percent","required_items":1,"required_item_tag_id":"dGFnOjI3ODI=","discount_item_tag_id":"dGFnOjI3ODI="}}}}},"required":true},"CreateMenuKitchenGroup":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMenuKitchenGroup"}}},"required":true},"CreateMenuPromo":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMenuPromo"},"examples":{"itemLevelDiscount":{"summary":"Link to an item-level discount","value":{"name":"Summer Item Special","promo_code":"SUMMER20","discount_id":"ZGlzY291bnQ6NTAzMw==","available_online":true,"available_kiosk":false}},"ticketLevelAdjustment":{"summary":"Link to a ticket-level adjustment","value":{"name":"Ticket $5 Off","promo_code":"SAVE5","adjustment_id":"YWRqdXN0bWVudDoxMjM=","available_online":false,"available_kiosk":true}}}}},"required":true},"PatchMenuPromo":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchMenuPromo"},"examples":{"itemLevelDiscount":{"summary":"Link to an item-level discount","value":{"name":"Summer Item Special","promo_code":"SUMMER20","discount_id":"ZGlzY291bnQ6NTAzMw==","available_online":true,"available_kiosk":false}},"ticketLevelAdjustment":{"summary":"Link to a ticket-level adjustment","value":{"name":"Ticket $5 Off","promo_code":"SAVE5","adjustment_id":"YWRqdXN0bWVudDoxMjM=","available_online":false,"available_kiosk":true}}}}},"required":true},"CreateMenuReportCategory":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMenuReportCategory"}}},"required":true},"CreateMenuTag":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMenuTag"}}},"required":true},"Orders":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Orders"},"example":{"customer_info":{"name":"Alex Example","phone":"5555550100","email":"alex.example@example.com","address":"123 Main Street","suite":"Suite 200","city":"Atlanta","state":"GA","zip":"30303"},"discounts":[{"discount_id":"YWRqdXN0bWVudDoxMjM0NQ==","item_id":"aXRlbTo5MjYwODc4","amount":2.5}],"drive_time":900,"items":[{"id":"aXRlbTo5MjYwODc4","quantity":1,"measured_amount":1,"modifiers":[{"ingredient_id":"aW5ncmVkaWVudDo1MDcwODk4","modifier_id":"bW9kaWZpZXI6MTM3NDAyMw==","segment_id":-1,"context_id":"Y29udGV4dEl0ZW06NTU1"},{"ingredient_id":"aW5ncmVkaWVudDo1MDcwODk5","modifier_id":"bW9kaWZpZXI6MTM3NDAyNA==","subitem":{"id":"aXRlbToxMDY5Mjg1Ng==","modifiers":[{"ingredient_id":"aW5ncmVkaWVudDo1MDcwMDkw","modifier_id":"bW9kaWZpZXI6MTM3NDAyNQ=="}]}}],"special_request":"No onions, please","size":"c2l6ZTow","misc_item":{"misc_name":"Extra Sauce","misc_price":1.5}}],"order_notes":"Please include utensils","order_type":"carryout","payment":{"payment_option":"unpaid","tip":3},"promise_time":1785139200,"room_id":"cm9vbToxMjQ2MzI=","service_charges":[{"service_charge_id":"YWRqdXN0bWVudDoxMzc4NjI=","amount":1.5}],"table_id":"dGFibGU6MTIzNDU=","skip_address_verification":false,"guest_count":2,"partner_order_id":"partner-order-20260727-001"}}},"required":true},"SetupPermissionsCreate":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetupPermissionsCreate"},"example":{"name":"Shift Lead","super_user":false,"order_void":true,"order_discount":false,"order_bill_house_account":false,"order_item_delete":true,"manager_reports":false,"manager_assign_cash_drawer":false,"manager_close_cash_drawer":false,"manager_time_punch":false,"manager_devices":false,"manager_printers":false,"manager_screen_saver":false,"manager_daily_close":false,"closed_sections":false,"order_void_transaction":false,"move_item":true,"reprint":true,"change_server":true,"change_table":true,"show_expected_cash":false,"stock_item":false,"online_order":false,"manager_comp":false,"pay_in_outs":false,"no_sale":false,"offline_mode":false,"force_send":false,"refund":false,"assign_pin":false,"apply_rewards":false,"reprint_kitchen":false,"training_mode":false,"no_tax":false,"misc_item":false,"manage_tip_pools":false,"manual_tip_outs":false,"unscheduled_clock_in":false,"split_check":true,"transfer_credit_card":false,"can_discard_changes":false,"enter_continuity_mode":false,"logout_pos":true,"large_tip_approval":false,"pause_third_party_ordering":false,"assigned_discounts":[{"discount_id":"ZGlzY291bnQ6MTIzNA=="}],"assigned_adjustments":[{"adjustment_id":"YWRqdXN0bWVudDo1Njc4"}],"assigned_staff":[{"staff_id":"c3RhZmY6MTY5Mjc4"}]}}},"required":true},"SetupPermissionsUpdate":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetupPermissionsCreate"},"example":{"name":"Shift Lead","super_user":false,"order_void":true,"order_discount":false,"order_bill_house_account":false,"order_item_delete":true,"manager_reports":false,"manager_assign_cash_drawer":false,"manager_close_cash_drawer":false,"manager_time_punch":false,"manager_devices":false,"manager_printers":false,"manager_screen_saver":false,"manager_daily_close":false,"closed_sections":false,"order_void_transaction":false,"move_item":true,"reprint":true,"change_server":true,"change_table":true,"show_expected_cash":false,"stock_item":false,"online_order":false,"manager_comp":false,"pay_in_outs":false,"no_sale":false,"offline_mode":false,"force_send":false,"refund":false,"assign_pin":false,"apply_rewards":false,"reprint_kitchen":false,"training_mode":false,"no_tax":false,"misc_item":false,"manage_tip_pools":false,"manual_tip_outs":false,"unscheduled_clock_in":false,"split_check":true,"transfer_credit_card":false,"can_discard_changes":false,"enter_continuity_mode":false,"logout_pos":true,"large_tip_approval":false,"pause_third_party_ordering":false,"assigned_discounts":[{"discount_id":"ZGlzY291bnQ6MTIzNA=="}],"assigned_adjustments":[{"adjustment_id":"YWRqdXN0bWVudDo1Njc4"}],"assigned_staff":[{"staff_id":"c3RhZmY6MTY5Mjc4"}]}}},"required":true},"SetupPermissionsPatch":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetupPermissionsPatch"}}},"required":true},"SetupScheduledShift":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetupScheduledShift"}}},"required":true},"SetupScheduledShiftCreate":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetupScheduledShiftCreate"}}},"required":true},"SetupStaffCreate":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetupStaffCreate"}}},"required":true},"SetupStaffUpdate":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetupStaffUpdate"}}},"required":true},"WebhookEndpoint":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEndpoint"}}},"required":true},"WebhookAuthorizationPost":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookAuthorizationPost"}}},"required":true}}},"paths":{"/v2/accounts/user":{"get":{"summary":"Validate if some entity is registered","description":"Use this endpoint to check if some entity is registered.","operationId":"accounts_user","parameters":[{"in":"query","name":"email","description":"Email to validate","required":false,"schema":{"type":"string"}},{"in":"query","name":"accountId","description":"Account ID to validate","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/UserAccounts"}},"example":[{"user":{"email":"email@example.com"}},{"user":{"accountName":"Name"}}]}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Accounts"]}},"/v2/labor/punch":{"post":{"description":"Create a new time punch","operationId":"labor_punch_put","requestBody":{"$ref":"#/components/requestBodies/TimePunch"},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimePunch"},"example":{"id":"dGltZXB1bmNoOjMxMzk0RDdDLUQxNDAtNDVEQS04NERGLTkyNDhENDIyOEE3RQ==","staff_id":"c3RhZmY6MzQ1ODU=","job_type_id":"am9iVHlwZTo3MTUx","punch_in_dt":"2017-01-14T12:00:00-00:00","punch_out_dt":"2017-01-14T22:00:00-00:00","regular_rate":14,"overtime_rate":21,"reported_tips":0}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Labor"]}},"/v2/labor/punch/{id}":{"put":{"description":"Update an existing time punch","operationId":"labor_punch_post","parameters":[{"in":"path","name":"id","description":"","required":true,"schema":{"type":"string"}}],"requestBody":{"$ref":"#/components/requestBodies/TimePunch"},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimePunch"},"example":{"id":"dGltZXB1bmNoOjMxMzk0RDdDLUQxNDAtNDVEQS04NERGLTkyNDhENDIyOEE3RQ==","staff_id":"c3RhZmY6MzQ1ODU=","job_type_id":"am9iVHlwZTo3MTUx","punch_in_dt":"2017-01-14T12:00:00-00:00","punch_out_dt":"2017-01-14T22:00:00-00:00","regular_rate":14,"overtime_rate":21,"reported_tips":0}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Labor"]},"delete":{"description":"Delete an existing time punch","operationId":"labor_punch_delete","parameters":[{"in":"path","name":"id","description":"","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteResponseType"},"example":{"success":true}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Labor"]}},"/v2/menu/adjustments":{"get":{"description":"Fetch list of adjustments","operationId":"menu_adjustments","parameters":[{"in":"query","name":"showDeleted","description":"Include deleted items","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MenuAdjustment"}},"example":[{"id":"YWRqdXN0bWVudDo2NTUz","name":"Delivery Fee","default_amount":3,"amount_type":"dollar","min_amount":0,"max_amount":0,"tax_exempt":false,"charge":true,"service_charge":true,"non_revenue":true,"auto_apply":true,"auto_apply_party_size":0,"room_specific":false},{"id":"YWRqdXN0bWVudDo2NTUw","name":"Open Manager Adjustment","default_amount":0,"amount_type":"percent","min_amount":0,"max_amount":0,"tax_exempt":false,"charge":false,"service_charge":false,"non_revenue":false,"auto_apply":false,"auto_apply_party_size":-1,"room_specific":true}]}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Menu"]},"post":{"description":"Create a new adjustment","operationId":"menu_adjustments_post","requestBody":{"$ref":"#/components/requestBodies/CreateMenuAdjustment"},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MenuAdjustment"},"example":{"id":"YWRqdXN0bWVudDo2NTUw","name":"Open Manager Adjustment","default_amount":0,"amount_type":"percent","min_amount":0,"max_amount":0,"tax_exempt":false,"charge":false,"service_charge":false,"non_revenue":false,"auto_apply":false,"auto_apply_party_size":-1,"room_specific":false}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Menu"]}},"/v2/menu/adjustments/{id}":{"post":{"deprecated":true,"summary":"Deprecated adjustment update","description":"Deprecated and removed. Updating an adjustment via POST is no longer supported and now returns 404. Use PUT /v2/menu/adjustments/{id} (full replace) or PATCH /v2/menu/adjustments/{id} (partial update) instead.","operationId":"menu_adjustments_update","parameters":[{"in":"path","name":"id","description":"Base64-encoded adjustment ID","required":true,"schema":{"type":"string"}}],"responses":{"404":{"description":"Not Found - Cannot POST /v2/menu/adjustments/{id}; use PUT or PATCH instead."}},"tags":["Menu"]},"patch":{"description":"Partially update an existing adjustment. Only provided fields will be updated.","operationId":"menu_adjustments_patch","parameters":[{"in":"path","name":"id","description":"Base64-encoded adjustment id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchMenuAdjustment"}}},"description":"Fields to update (all optional)","required":true},"responses":{"200":{"description":"Patch succeeded. No payload is returned; clients needing the new state should call `GET /v2/menu/adjustments`."},"400":{"description":"Bad Request. Possible error messages include:\n- id is invalid\n- name: String must contain at least 1 character(s)\n- default_amount: Expected number, received string\n- auto_apply_party_size: Number must be greater than or equal to 0"},"401":{"description":"Unauthorized. Possible causes include:\n- Missing API key\n- Missing or expired token"},"403":{"description":"Invalid API Key"},"404":{"description":"Adjustment not found"},"500":{"description":"Internal server error"}},"tags":["Menu"]},"put":{"description":"Fully replace an adjustment by ID. Only `name` is required; all other fields default if omitted (`default_amount`: 0, `min_amount`: 0, `max_amount`: 0, `amount_type`: \"percent\", `tax_exempt`: false, `charge`: false, `service_charge`: false, `non_revenue`: false, `auto_apply`: false, `auto_apply_party_size`: ignored when `auto_apply` is false — stored as -1, `room_specific`: false).","operationId":"menu_adjustments_put","parameters":[{"in":"path","name":"id","description":"Base64-encoded adjustment id (e.g. YWRqdXN0bWVudDoxNjE0OTI=)","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"description":"Adjustment fields to replace (`name` required, all others optional with defaults)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PutMenuAdjustment"},"examples":{"full":{"summary":"Full update","value":{"name":"20% Gratuity","default_amount":20,"amount_type":"percent","min_amount":0,"max_amount":25,"tax_exempt":false,"charge":true,"service_charge":true,"non_revenue":false,"auto_apply":true,"auto_apply_party_size":6,"room_specific":false}},"partial":{"summary":"Partial body — omitted fields reset to defaults","value":{"name":"Service Charge","auto_apply":false}},"reset":{"summary":"Reset all optional fields to defaults","value":{"name":"Open Adjustment"}}}}}},"responses":{"200":{"description":"OK. Returns the updated adjustment.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PutMenuAdjustmentResponse"},"example":{"id":"YWRqdXN0bWVudDoxNjE0OTI=","name":"20% Gratuity","default_amount":20,"amount_type":"percent","min_amount":0,"max_amount":25,"tax_exempt":false,"charge":true,"service_charge":true,"non_revenue":false,"auto_apply":true,"auto_apply_party_size":6,"room_specific":false}}}},"400":{"description":"Bad Request. Example message: `id: invalid`."},"401":{"description":"Unauthorized. Example message: `Invalid Authentication Key`."},"403":{"description":"Forbidden. Example message: `Forbidden: insufficient permissions to update`."},"404":{"description":"Not Found. Example message: `adjustment not found: adjustment:<id>`."},"500":{"description":"Internal Server Error. Example message: `Invalid URL type, expected adjustment`."}},"tags":["Menu"]}},"/v2/menu/attributes":{"get":{"description":"Fetch list of attributes","operationId":"menu_attributes","parameters":[{"in":"query","name":"showDeleted","description":"Include deleted items","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MenuAttribute"}},"example":[{"id":"YXR0cmlidXRlOjI5MTM=","name":"Gluten Free","available_online":false},{"id":"YXR0cmlidXRlOjI5MTU=","name":"MB Favorite!","available_online":true}]}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Menu"]},"post":{"description":"Create a new attribute","operationId":"menu_attributes_post","requestBody":{"$ref":"#/components/requestBodies/CreateMenuAttribute"},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MenuAttribute"},"example":{"id":"YXR0cmlidXRlOjI5MTM=","name":"Gluten Free","available_online":false}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Menu"]}},"/v2/menu/attributes/{id}":{"post":{"deprecated":true,"summary":"Deprecated attribute update","description":"Deprecated and removed. Updating an attribute via POST is no longer supported and now returns 404. Use PUT /v2/menu/attributes/{id} (full replace) or PATCH /v2/menu/attributes/{id} (partial update) instead.","operationId":"menu_attributes_update","parameters":[{"in":"path","name":"id","description":"","required":true,"schema":{"type":"string"}}],"responses":{"404":{"description":"Not Found - Cannot POST /v2/menu/attributes/{id}; use PUT or PATCH instead."}},"tags":["Menu"]},"patch":{"description":"Partially update an existing attribute. All fields are optional; omitted fields remain unchanged.","operationId":"menu_attributes_patch","parameters":[{"in":"path","name":"id","description":"Base64-encoded attribute ID. Format: `attribute:<numeric_id>`","required":true,"schema":{"type":"string"}}],"requestBody":{"description":"Attribute fields to update. All fields are optional.","required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchMenuAttribute"},"examples":{"name_only":{"summary":"Update name only","value":{"name":"Vegan"}},"available_online_only":{"summary":"Update available_online only","value":{"available_online":false}},"both_fields":{"summary":"Update both fields","value":{"name":"Spicy","available_online":true}}}}}},"responses":{"200":{"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"description":"Forbidden. Example message: `Forbidden: insufficient permissions to update`."},"404":{"description":"Not Found. Example message: `attribute not found: attribute:<id>`."}},"tags":["Menu"]},"put":{"description":"Fully replace an attribute by ID. `name` is required; `available_online` defaults to `true` if omitted.","operationId":"menu_attributes_put","parameters":[{"in":"path","name":"id","description":"Base64-encoded attribute ID. Format: `attribute:<numeric_id>`","required":true,"schema":{"type":"string"}}],"requestBody":{"description":"Attribute fields to replace (`name` required, `available_online` optional, defaults to `true`)","required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PutMenuAttribute"},"examples":{"full":{"summary":"All fields provided","value":{"name":"Spicy","available_online":true}},"name_only":{"summary":"available_online omitted — defaults to true","value":{"name":"Vegan"}}}}}},"responses":{"200":{"description":"OK. Returns the updated attribute.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MenuAttribute"},"example":{"id":"YXR0cmlidXRlOjI5MTM=","name":"Spicy","available_online":true}}}},"400":{"description":"Bad Request. Example message: `id: invalid` or `name: Required`."},"401":{"description":"Unauthorized. Example message: `Invalid Authentication Key`."},"403":{"description":"Forbidden. Example message: `Forbidden: insufficient permissions to update`."},"404":{"description":"Not Found. Example message: `attribute not found: attribute:<id>`."}},"tags":["Menu"]}},"/v2/menu/contextItems":{"get":{"description":"Fetch list of context items","operationId":"menu_contextItems","parameters":[{"in":"query","name":"showDeleted","description":"Include deleted items","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MenuContextItem"}},"example":[{"id":"Y29udGV4dEl0ZW06NzU5NQ==","name":"Extra","short_name":"","ingredients":[{"ingredient_id":"aW5ncmVkaWVudDo5MTI2MTU=","multiplier":1},{"ingredient_id":"aW5ncmVkaWVudDo5MTI2MjY=","multiplier":0.05}],"available_online":true},{"id":"Y29udGV4dEl0ZW06NzU5Ng==","name":"On Side","short_name":"","ingredients":[],"available_online":false}]}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Menu"]},"post":{"description":"Create a new context item","operationId":"menu_contextItems_post","requestBody":{"$ref":"#/components/requestBodies/CreateMenuContextItem"},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PutMenuContextItemResponse"},"example":{"id":"Y29udGV4dEl0ZW06NzU5NQ==","name":"Extra","short_name":"","ingredients":[{"ingredient_id":"aW5ncmVkaWVudDo5MTI2MTU=","multiplier":2},{"ingredient_id":"aW5ncmVkaWVudDo5MTI2MjY=","multiplier":1}],"available_online":true}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Menu"]}},"/v2/menu/contextItems/{id}":{"post":{"deprecated":true,"description":"Deprecated and removed. Updating a context item via POST is no longer supported and now returns 404. Use PUT /v2/menu/contextItems/{id} (full replace) or PATCH /v2/menu/contextItems/{id} (partial update) instead.","operationId":"menu_contextItems_update","parameters":[{"in":"path","name":"id","description":"","required":true,"schema":{"type":"string"}}],"responses":{"404":{"description":"Not Found - Cannot POST /v2/menu/contextItems/{id}; use PUT or PATCH instead."}},"tags":["Menu"]},"patch":{"description":"Partially update an existing context item.","operationId":"menu_contextItems_patch","parameters":[{"in":"path","name":"id","description":"ID of the context item to update","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchMenuContextItem"}}},"description":"Fields to patch on the context item","required":true},"responses":{"200":{"description":"Patch succeeded. No payload is returned; clients needing the new state should call `GET /v2/menu/contextItems`."},"400":{"description":"Bad Request. Example message: `id: invalid`."},"401":{"description":"Unauthorized. Example message: `Invalid Authentication Key`."},"403":{"description":"Forbidden. Example message: `Forbidden: insufficient permissions to update`."},"404":{"description":"Not Found. Example message: `contextItem not found: contextItem:<id>`."},"500":{"description":"Internal Server Error. Example message: `Internal Server Error`."}},"tags":["Menu"]},"put":{"description":"Fully replace a context item by ID. Only `name` is required; all other fields default if omitted (`short_name`: \"\", `available_online`: true, `ingredients`: []).","operationId":"menu_contextItems_put","parameters":[{"in":"path","name":"id","description":"Base64-encoded context item ID. Format: `contextItem:<numeric_id>`","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PutMenuContextItem"},"examples":{"full":{"summary":"Full update","value":{"name":"Extra","short_name":"","ingredients":[{"ingredient_id":"aW5ncmVkaWVudDoxMDI3NTU2","multiplier":1}],"available_online":true}},"partial":{"summary":"Partial body - omitted fields reset to defaults","value":{"name":"Extra","available_online":false}},"reset":{"summary":"Reset all optional fields to defaults","value":{"name":"Extra"}}}}},"description":"Context item fields to replace (`name` required, all others optional with defaults)","required":true},"responses":{"200":{"description":"OK. Returns the updated context item.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PutMenuContextItemResponse"}}}},"400":{"description":"Bad Request. Example message: `id: invalid`."},"401":{"description":"Unauthorized. Example message: `Invalid Authentication Key`."},"403":{"description":"Forbidden. Example message: `Forbidden: insufficient permissions to update`."},"404":{"description":"Not Found. Example message: `contextItem not found: contextItem:<id>`."},"500":{"description":"Internal Server Error. Example message: `Internal Server Error`."}},"tags":["Menu"]}},"/v2/menu/promotions":{"get":{"description":"Fetch list of promotions (promo codes). Each promo code is linked to either an item-level discount or a ticket-level adjustment.","operationId":"menu_promotions","parameters":[{"in":"query","name":"showDeleted","description":"Include deleted items","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MenuPromo"}},"example":[{"id":"cHJvbW86NTAzMw==","name":"Summer Item Special","promo_code":"SUMMER20","type":"discount","discount_id":"ZGlzY291bnQ6NTAzMw==","adjustment_id":null,"available_online":true,"available_kiosk":false},{"id":"cHJvbW86NTA0MA==","name":"Ticket $5 Off","promo_code":"SAVE5","type":"adjustment","discount_id":null,"adjustment_id":"YWRqdXN0bWVudDoxMjM=","available_online":false,"available_kiosk":true}]}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Menu"]},"post":{"description":"Create a new promo code. Must be linked to exactly one of `discount_id` or `adjustment_id`.","operationId":"menu_promotions_post","requestBody":{"$ref":"#/components/requestBodies/CreateMenuPromo"},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MenuPromo"},"example":{"id":"cHJvbW86NTAzMw==","name":"Summer Item Special","promo_code":"SUMMER20","type":"discount","discount_id":"ZGlzY291bnQ6NTAzMw==","adjustment_id":null,"available_online":true,"available_kiosk":false}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"description":"Not Found. Example message: `discount_id not found: discount:<id>`."}},"tags":["Menu"]}},"/v2/menu/promotions/{id}":{"patch":{"description":"Partially update a promo code. Only fields sent are changed.","operationId":"menu_promotions_patch","parameters":[{"in":"path","name":"id","description":"Base64-encoded promotion ID. Format: `promo:<numeric_id>`.","required":true,"schema":{"type":"string"}}],"requestBody":{"$ref":"#/components/requestBodies/PatchMenuPromo"},"responses":{"200":{"description":"Patch succeeded. No payload is returned; clients needing the new state should call `GET /v2/menu/promotions`."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"description":"Not Found. The promotion or supplied parent discount/adjustment does not exist."}},"tags":["Menu"]},"put":{"description":"Fully replace a promo code by ID.","operationId":"menu_promotions_put","parameters":[{"in":"path","name":"id","description":"Base64-encoded promotion ID. Format: `promo:<numeric_id>`.","required":true,"schema":{"type":"string"}}],"requestBody":{"$ref":"#/components/requestBodies/CreateMenuPromo"},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MenuPromo"},"example":{"id":"cHJvbW86NTAzMw==","name":"Summer Item Special","promo_code":"SUMMER20","type":"discount","discount_id":"ZGlzY291bnQ6NTAzMw==","adjustment_id":null,"available_online":true,"available_kiosk":false}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"description":"Not Found. Example message: `promo not found: promo:<id>`."}},"tags":["Menu"]}},"/v2/menu/discounts":{"get":{"description":"Fetch list of discounts","operationId":"menu_discounts","parameters":[{"in":"query","name":"showDeleted","description":"Include deleted items","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MenuDiscount"}},"example":[{"id":"ZGlzY291bnQ6NTAzMw==","name":"BOGO Half Off Sandwiches","tax_exempt":false,"open_amount":false,"affect_modifiers":true,"amount":100,"amount_type":"percent","required_items":1,"required_item_tag_id":"dGFnOjI3ODI=","discount_item_tag_id":"dGFnOjI3ODI="},{"id":"ZGlzY291bnQ6NDk2OA==","name":"Manager Comp","tax_exempt":false,"open_amount":true,"affect_modifiers":true,"amount":0,"amount_type":"dollar","required_items":0,"required_item_tag_id":"","discount_item_tag_id":""}]}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Menu"]},"post":{"description":"Create new discount","operationId":"menu_discounts_post","requestBody":{"$ref":"#/components/requestBodies/CreateMenuDiscount"},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostMenuDiscount"},"example":{"id":"ZGlzY291bnQ6NTAzMw==","name":"BOGO Half Off Sandwiches","tax_exempt":false,"open_amount":false,"affect_modifiers":true,"amount":100,"amount_type":"percent","required_items":1,"required_item_tag_id":"dGFnOjI3ODI=","discount_item_tag_id":"dGFnOjI3ODI="}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Menu"]}},"/v2/menu/discounts/{id}":{"post":{"deprecated":true,"description":"Deprecated and removed. Updating a discount via POST is no longer supported and now returns 404. Use PUT /v2/menu/discounts/{id} (full replace) or PATCH /v2/menu/discounts/{id} (partial update) instead.","operationId":"menu_discounts_update","parameters":[{"in":"path","name":"id","description":"","required":true,"schema":{"type":"string"}}],"responses":{"404":{"description":"Not Found - POST-based discount update has been removed; use PUT or PATCH instead."}},"tags":["Menu"]},"patch":{"description":"Partially update an existing discount","operationId":"menu_discounts_patch","parameters":[{"in":"path","name":"id","description":"","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchMenuDiscount"},"examples":{"example":{"value":{"name":"10% Off Appetizers","tax_exempt":true,"open_amount":false,"affect_modifiers":true,"amount":10,"amount_type":"percent","required_items":1,"required_item_tag_id":"dGFnOjI3ODI=","discount_item_tag_id":"dGFnOjI3ODI="}}}}},"required":true},"responses":{"200":{"description":"Patch succeeded. No payload is returned; clients needing the new state should call `GET /v2/menu/discounts`."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"description":"Forbidden. Example message: `Forbidden: insufficient permissions to update`."},"404":{"description":"Not Found. Example message: `discount not found: <id>`."},"500":{"description":"Internal Server Error. Example message: `Internal Server Error`."}},"tags":["Menu"]},"put":{"description":"Fully replace a discount by ID. Only `name` is required; omitted fields reset to defaults (`amount_type`: `percent`, `tax_exempt`: `false`, `open_amount`: `false`, `affect_modifiers`: `false`, `amount`: `0`, `required_items`: `0`, `required_item_tag_id`: `\"\"`, `discount_item_tag_id`: `\"\"`).","operationId":"menu_discounts_put","parameters":[{"in":"path","name":"id","description":"Base64-encoded discount ID. Format: `discount:<numeric_id>`.","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PutMenuDiscount"},"examples":{"example":{"value":{"name":"10% Off Appetizers","tax_exempt":true,"open_amount":false,"affect_modifiers":true,"amount":10,"amount_type":"percent","required_items":1,"required_item_tag_id":"dGFnOjI3ODI=","discount_item_tag_id":"dGFnOjI3ODI="}}}}},"required":true},"responses":{"200":{"description":"OK. Returns the updated discount.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MenuDiscount"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"description":"Forbidden. Example message: `Forbidden: insufficient permissions to update`."},"404":{"description":"Not Found. Example message: `discount not found: <id>`."},"500":{"description":"Internal Server Error. Example message: `Internal Server Error`."}},"tags":["Menu"]}},"/v2/menu/groups":{"get":{"description":"Fetch list of groups","operationId":"menu_groups","parameters":[{"in":"query","name":"showDeleted","description":"Include deleted items","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MenuGroup"}},"example":[{"id":"Z3JvdXA6NTgxMg==","name":"Dinner","sections":[{"section_id":"c2VjdGlvbjoyNzYxMw==","sort_order":1741944538},{"section_id":"c2VjdGlvbjoyNzYxNA==","sort_order":1749711766}],"available_online":false},{"id":"Z3JvdXA6NTc1NQ==","name":"Lunch","sections":[{"section_id":"c2VjdGlvbjoyNzYxMw==","sort_order":1741944538},{"section_id":"c2VjdGlvbjoyNzYxNA==","sort_order":1749711766}],"available_online":true}]}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Menu"]},"post":{"description":"Create a new menu group","operationId":"menu_group_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMenuGroup"}}},"required":true},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReturnCreateMenuGroup"},"example":{"id":"Z3JvdXA6NTgxMg==","name":"Dinner","sections":[{"section_id":"c2VjdGlvbjoyNzYxMw=="},{"section_id":"c2VjdGlvbjoyNzYxNA=="}],"available_online":true}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Menu"]}},"/v2/menu/groups/{id}":{"patch":{"description":"Partially update a menu group by ID. Only fields present in the request body are updated. For sections: omit to leave unchanged, provide a non-empty array to replace all, provide an empty array to remove all.","operationId":"menu_group_patch","parameters":[{"in":"path","name":"id","description":"Base64-encoded group ID. Format: `group:<numeric_id>` (e.g. `Z3JvdXA6MTM0ODcx` = `group:134871`)","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchMenuGroup"},"examples":{"example":{"value":{"name":"Happy Hour","sections":[{"section_id":"c2VjdGlvbjoyNzYxMw=="}],"available_online":true}}}},"text/json":{"schema":{"$ref":"#/components/schemas/PatchMenuGroup"}}},"description":"Fields to update (all optional)","required":true},"responses":{"200":{"description":"Patch succeeded. No payload is returned; clients needing the new state should call `GET /v2/menu/groups`."},"400":{"description":"Bad Request. Example message: `id: invalid`."},"401":{"description":"Unauthorized. Example message: `Invalid Authentication Key`."},"403":{"description":"Forbidden. Example message: `Forbidden: insufficient permissions to update`."},"404":{"description":"Not Found. Example message: `group not found`."},"500":{"description":"Internal Server Error. Example message: `Internal Server Error`."}},"tags":["Menu"]},"put":{"description":"Fully replace a menu group by ID. `name` is required; `sections` defaults to `[]` and `available_online` defaults to `true` if omitted.","operationId":"menu_group_put","parameters":[{"in":"path","name":"id","description":"Base64-encoded group ID. Format: `group:<numeric_id>` (e.g. `Z3JvdXA6MTM0ODcx` = `group:134871`)","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PutMenuGroup"},"examples":{"full":{"summary":"Full update","value":{"name":"Happy Hour","sections":[{"section_id":"c2VjdGlvbjoyNzYxMw=="}],"available_online":true}},"defaults":{"summary":"Name only — sections reset to [] and available_online reset to true","value":{"name":"Happy Hour"}}}}},"description":"Group fields to replace (`name` required; `sections` and `available_online` optional with defaults)","required":true},"responses":{"200":{"description":"OK. Returns the updated group.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PutMenuGroupResponse"}}}},"400":{"description":"Bad Request. Example message: `id: invalid`."},"401":{"description":"Unauthorized. Example message: `Invalid Authentication Key`."},"403":{"description":"Forbidden. Example message: `Forbidden: insufficient permissions to update`."},"404":{"description":"Not Found. Example message: `group not found`."},"500":{"description":"Internal Server Error. Example message: `Internal Server Error`."}},"tags":["Menu"]}},"/v2/menu/ingredients":{"get":{"description":"Fetch list of ingredients","operationId":"menu_ingredients","parameters":[{"in":"query","name":"showDeleted","description":"Include deleted items","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/GetMenuIngredient"}},"example":[{"id":"aW5ncmVkaWVudDoxNzkxNTY=","name":"9 Grain","short_name":"","available_online":false,"stock":0,"subitem_id":"","misc_ingredient":false,"context_items":[{"context_item_id":"Y29udGV4dEl0ZW06MjUzNTUz","multiplier":2}]},{"id":"aW5ncmVkaWVudDoxNzg5NDc=","name":"Bacon","short_name":"","available_online":true,"stock":-1,"subitem_id":"","misc_ingredient":false,"context_items":[]}]}}},"400":{"description":"Bad Request. Example message: `Invalid parameters`."},"401":{"description":"Unauthorized. Example message: `Invalid Authentication Key`."},"403":{"description":"Forbidden. Example message: `Forbidden: insufficient permissions`."},"500":{"description":"Internal Server Error. Example message: `Internal Server Error`."}},"tags":["Menu"]},"post":{"description":"Create a new menu ingredients","operationId":"menu_ingredients_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMenuIngredient"}}},"required":true},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","description":"Base64-encoded ingredient ID."}}},"example":{"id":"aW5ncmVkaWVudDoxMDcxMjYzMg=="}}}},"400":{"description":"Invalid parameters"},"401":{"description":"Invalid API key"}},"tags":["Menu"]}},"/v2/menu/ingredients/{id}":{"put":{"description":"Fully replace an ingredient by ID. Only `name` is required; all other fields default if omitted (`short_name`: \"\", `available_online`: true, `stock`: -1, `subitem_id`: \"\", `context_items`: []).","operationId":"menu_ingredients_put","parameters":[{"in":"path","name":"id","description":"Base64-encoded ingredient ID. Format: `ingredient:<numeric_id>` (e.g. `aW5ncmVkaWVudDozNTk4MDg0` = `ingredient:3598084`)","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PutMenuIngredient"},"examples":{"example":{"value":{"name":"Bacon","short_name":"BCN","available_online":true,"stock":-1,"subitem_id":"","context_items":[]}}}},"text/json":{"schema":{"$ref":"#/components/schemas/PutMenuIngredient"}}},"description":"Ingredient fields to replace (`name` required, all others optional with defaults)","required":true},"responses":{"200":{"description":"OK. Returns the updated ingredient.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MenuIngredient"},"examples":{"response":{"value":{"id":"aW5ncmVkaWVudDoxMDcxMjYzMg==","name":"Bacon","short_name":"BCN","available_online":true,"stock":-1,"subitem_id":"","context_items":[]}}}},"text/json":{"schema":{"$ref":"#/components/schemas/MenuIngredient"}}}},"400":{"description":"Bad Request. Example message: `id: invalid`."},"401":{"description":"Unauthorized. Example message: `Invalid Authentication Key`."},"403":{"description":"Forbidden. Example message: `Forbidden: insufficient permissions to update`."},"404":{"description":"Not Found. Example message: `ingredient not found`."},"500":{"description":"Internal Server Error. Example message: `Internal Server Error`."}},"tags":["Menu"]},"patch":{"description":"Partially update an ingredient by ID. Only fields present in the request body are updated. For context_items: omit to leave unchanged, provide non-empty array to replace all, provide empty array to remove all.","operationId":"menu_ingredients_patch","parameters":[{"in":"path","name":"id","description":"Base64-encoded ingredient ID (e.g. aW5ncmVkaWVudDozNTk4MDg0)","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchMenuIngredient"}}},"description":"Fields to update (all optional)","required":true},"responses":{"200":{"description":"Patch succeeded. No payload is returned; clients needing the new state should call `GET /v2/menu/ingredients`."},"400":{"description":"Bad Request. Example message: `id: invalid`."},"401":{"description":"Unauthorized. Example message: `Invalid Authentication Key`."},"403":{"description":"Forbidden. Example message: `Forbidden: insufficient permissions to update`."},"404":{"description":"Not Found. Example message: `ingredient not found: contextItem:<id>`."},"500":{"description":"Internal Server Error. Example message: `Internal Server Error`."}},"tags":["Menu"]}},"/v2/menu/items":{"get":{"description":"Fetch list of items","operationId":"menu_items","parameters":[{"in":"query","name":"showDeleted","description":"Include deleted items","required":false,"schema":{"type":"boolean"}},{"in":"query","name":"page","description":"Page number (starts from 1). When provided with limit, returns paginated response.","required":false,"schema":{"type":"integer","minimum":1}},{"in":"query","name":"limit","description":"Number of items per page. When provided with page, returns paginated response.","required":false,"schema":{"type":"integer","minimum":1}}],"responses":{"200":{"description":"OK. This endpoint supports two response formats depending on whether pagination query parameters are provided.","content":{"application/json":{"schema":{"oneOf":[{"type":"array","items":{"$ref":"#/components/schemas/GetMenuItem"},"title":"Legacy Format"},{"title":"Paginated Format","allOf":[{"$ref":"#/components/schemas/PaginatedMenuItemsResponse"}]}]},"examples":{"Legacy Format":{"summary":"Response without page/limit parameters — returns a simple array","value":[{"id":"aXRlbToyOTczNjM=","name":"The BLTA","short_name":"BLTA","image_URL":"https://example.com/image.jpg","description":"The classic re-envisioned with bacon, lettuce, tomato, and avocado on toasted white.","sku":"","price":9,"cost":3.5,"stock":100,"tax_type":null,"non_revenue":false,"measurement_type":null,"tare":0.1,"decimal_places":2,"default_course":0,"prevent_discounts":false,"misc_item":false,"hide_on_receipt":false,"gift_card":false,"tippable":true,"separate_seats":false,"half_pricing":"none","report_category_id":"cmVwb3J0Q2F0ZWdvcnk6OTUwMg==","kitchen_group_id":"a2l0Y2hlbkdyb3VwOjU4NTM=","sizes":[{"item_size_id":"c2l6ZTo5MzA2OTI=","size_id":"c2l6ZTo3Mzg4Ng==","price":9.5,"cost":3.75,"sort_order":0,"is_default":true},{"item_size_id":"c2l6ZTo5MzA2OTM=","size_id":"c2l6ZTo3Mzg4Nw==","price":5.5,"cost":2.75,"sort_order":1,"is_default":false}],"tags":[{"tag_id":"dGFnOjI3MjE="},{"tag_id":"dGFnOjI3ODI="}],"attributes":[{"attribute_id":"YXR0cmlidXRlOjI5MTU="}],"modifiers":[{"modifier_id":"bW9kaWZpZXI6NDIxNjg=","excluded_online_item":false,"default_ingredients":[{"ingredient_id":"aW5ncmVkaWVudDo4Nzc5MzU="},{"ingredient_id":"aW5ncmVkaWVudDo4Nzc5MzY="}],"excluded_online_ingredients":[{"ingredient_id":"aW5ncmVkaWVudDo4Nzc5MzU="}],"sort_order":0},{"modifier_id":"bW9kaWZpZXI6NDIxNjk=","excluded_online_item":true,"default_ingredients":[{"ingredient_id":"aW5ncmVkaWVudDo4Nzc5MzU="}],"excluded_online_ingredients":[{"ingredient_id":"aW5ncmVkaWVudDo4Nzc5MzU="}],"sort_order":1}],"available_online":true,"alcohol":false,"button_color":"#000000"},{"id":"aXRlbToyOTgyMTM=","name":"The Broccoli Cheddar Soup","short_name":"BCS","description":"Creamy soup made with broccoli and heavy amounts of cheddar cheese.","sku":"","price":0,"cost":0,"stock":-1,"tax_type":null,"non_revenue":false,"measurement_type":null,"tare":0.1,"decimal_places":2,"default_course":0,"prevent_discounts":false,"misc_item":false,"hide_on_receipt":false,"gift_card":false,"tippable":true,"separate_seats":false,"half_pricing":"none","report_category_id":"cmVwb3J0Q2F0ZWdvcnk6OTUwMg==","kitchen_group_id":"","sizes":[{"item_size_id":"c2l6ZTo5MzA2OTI=","size_id":"c2l6ZToxMTQ4Mw==","price":4,"cost":2,"sort_order":0,"is_default":true},{"item_size_id":"c2l6ZTo5MzA2OTM=","size_id":"c2l6ZToxMTQ4NA==","price":7,"cost":3,"sort_order":1,"is_default":false}],"tags":[{"tag_id":"dGFnOjI3MjE="}],"attributes":[{"attribute_id":"YXR0cmlidXRlOjI5MTQ="},{"attribute_id":"YXR0cmlidXRlOjI5MTM="}],"modifiers":[],"available_online":true,"alcohol":false,"button_color":"#FF0000"}]},"Paginated Format":{"summary":"Response with page/limit parameters — returns object with data array and pagination metadata","value":{"data":[{"id":"aXRlbToyOTczNjM=","name":"The BLTA","short_name":"BLTA","image_URL":"https://example.com/image.jpg","description":"The classic re-envisioned with bacon, lettuce, tomato, and avocado on toasted white.","sku":"","price":9,"cost":3.5,"stock":100,"tax_type":null,"non_revenue":false,"measurement_type":null,"tare":0.1,"decimal_places":2,"default_course":0,"prevent_discounts":false,"misc_item":false,"hide_on_receipt":false,"gift_card":false,"tippable":true,"separate_seats":false,"half_pricing":"none","report_category_id":"cmVwb3J0Q2F0ZWdvcnk6OTUwMg==","kitchen_group_id":"a2l0Y2hlbkdyb3VwOjU4NTM=","sizes":[{"item_size_id":"c2l6ZTo5MzA2OTI=","size_id":"c2l6ZTo3Mzg4Ng==","price":9.5,"cost":3.75,"sort_order":0,"is_default":true},{"item_size_id":"c2l6ZTo5MzA2OTM=","size_id":"c2l6ZTo3Mzg4Nw==","price":5.5,"cost":2.75,"sort_order":1,"is_default":false}],"tags":[{"tag_id":"dGFnOjI3MjE="},{"tag_id":"dGFnOjI3ODI="}],"attributes":[{"attribute_id":"YXR0cmlidXRlOjI5MTU="}],"modifiers":[{"modifier_id":"bW9kaWZpZXI6NDIxNjg=","excluded_online_item":false,"default_ingredients":[{"ingredient_id":"aW5ncmVkaWVudDo4Nzc5MzU="},{"ingredient_id":"aW5ncmVkaWVudDo4Nzc5MzY="}],"excluded_online_ingredients":[{"ingredient_id":"aW5ncmVkaWVudDo4Nzc5MzU="}],"sort_order":0},{"modifier_id":"bW9kaWZpZXI6NDIxNjk=","excluded_online_item":true,"default_ingredients":[{"ingredient_id":"aW5ncmVkaWVudDo4Nzc5MzU="}],"excluded_online_ingredients":[{"ingredient_id":"aW5ncmVkaWVudDo4Nzc5MzU="}],"sort_order":1}],"available_online":true,"alcohol":false,"button_color":"#000000"}],"pagination":{"total":142,"page":1,"limit":50,"total_pages":3}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Menu"]},"post":{"description":"Create a new menu item","operationId":"menu_items_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MenuItemCreate"}}},"required":true},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MenuItemResponse"},"example":{"id":"a2l0Y2hlbkdyb3VwOjU4NTM="}}}},"400":{"description":"Bad Request. Possible error messages include:\n- size_id has duplicate values\n- only one size can have is_default set to true"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Menu"]}},"/v2/menu/items/{id}":{"put":{"description":"Update an existing menu item's description and/or price","operationId":"menu_item_put","parameters":[{"in":"path","name":"id","description":"","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MenuItemUpdate"}}},"required":true},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MenuItem"},"example":{"id":"aXRlbToyOTczNjM=","name":"The BLTA","short_name":"BLTA","description":"The classic re-envisioned with bacon, lettuce, tomato, and avocado on toasted white.","sku":"","price":9,"cost":3.5,"stock":100,"tax_type":null,"non_revenue":false,"measurement_type":null,"tare":null,"decimal_places":null,"default_course":0,"prevent_discounts":false,"misc_item":false,"hide_on_receipt":false,"gift_card":false,"tippable":true,"separate_seats":false,"half_pricing":"none","report_category_id":"cmVwb3J0Q2F0ZWdvcnk6OTUwMg==","kitchen_group_id":"a2l0Y2hlbkdyb3VwOjU4NTM=","sizes":[{"item_size_id":"c2l6ZTo5MzA2OTI=","size_id":"c2l6ZTo3Mzg4Ng==","price":9.5,"cost":3.75},{"item_size_id":"c2l6ZTo5MzA2OTM=","size_id":"c2l6ZTo3Mzg4Nw==","price":5.5,"cost":2.75}],"tags":[{"tag_id":"dGFnOjI3MjE="},{"tag_id":"dGFnOjI3ODI="}],"attributes":[{"attribute_id":"YXR0cmlidXRlOjI5MTU="}],"modifiers":[{"modifier_id":"bW9kaWZpZXI6NDIxNjg="},{"modifier_id":"bW9kaWZpZXI6NDIxNjk="}],"available_online":true,"alcohol":false}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Menu"]},"patch":{"description":"Partially update an existing menu item.","operationId":"menu_item_patch","parameters":[{"in":"path","name":"id","description":"Base64-encoded item ID (e.g. aXRlbToyOTczNjM=)","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchMenuItem"}}},"description":"Fields to update (all optional; at least one field is required)","required":true},"responses":{"200":{"description":"Patch succeeded. No payload is returned; clients needing the new state should call `GET /v2/menu/items`."},"400":{"description":"Bad Request. Possible error messages include:\n- id: invalid\n- size_id has duplicate values\n- only one size can have is_default set to true"},"401":{"description":"Unauthorized. Example message: `Invalid Authentication Key`."},"403":{"description":"Forbidden. Example message: `Forbidden: insufficient permissions to update`."},"404":{"description":"Not Found. Example message: `item not found: item:<id>`."},"500":{"description":"Internal Server Error. Example message: `Internal Server Error`."}},"tags":["Menu"]}},"/v2/menu/kitchenGroups":{"get":{"description":"Fetch list of kitchen groups","operationId":"menu_kitchenGroups","parameters":[{"in":"query","name":"showDeleted","description":"Include deleted items","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MenuKitchenGroup"}},"example":[{"id":"a2l0Y2hlbkdyb3VwOjU4NTM=","name":"Cold Sandwich Line"},{"id":"a2l0Y2hlbkdyb3VwOjU4NTQ=","name":"Panini Line"}]}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Menu"]},"post":{"description":"Create a new kitchen group","operationId":"menu_kitchenGroups_post","requestBody":{"$ref":"#/components/requestBodies/CreateMenuKitchenGroup"},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MenuKitchenGroup"},"example":{"id":"a2l0Y2hlbkdyb3VwOjU4NTM=","name":"Cold Sandwich Line"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Menu"]}},"/v2/menu/kitchenGroups/{id}":{"post":{"deprecated":true,"summary":"Deprecated kitchen group update","description":"Deprecated and removed. Updating a kitchen group via POST is no longer supported and now returns 404. Use PUT /v2/menu/kitchenGroups/{id} (full replace) or PATCH /v2/menu/kitchenGroups/{id} (partial update) instead.","operationId":"menu_kitchenGroups_update","parameters":[{"in":"path","name":"id","description":"","required":true,"schema":{"type":"string"}}],"responses":{"404":{"description":"Not Found - Cannot POST /v2/menu/kitchenGroups/{id}; use PUT or PATCH instead."}},"tags":["Menu"]},"put":{"description":"Fully replace a kitchen group by ID. `name` is required.","operationId":"menu_kitchenGroups_put","parameters":[{"in":"path","name":"id","description":"Base64-encoded kitchen group ID. Format: `kitchenGroup:<numeric_id>` (e.g. `a2l0Y2hlbkdyb3VwOjU4NTM=` = `kitchenGroup:5853`)","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PutMenuKitchenGroup"},"example":{"name":"Cold Sandwich Line"}},"text/json":{"schema":{"$ref":"#/components/schemas/PutMenuKitchenGroup"}}},"description":"Kitchen group fields to replace (`name` required)","required":true},"responses":{"200":{"description":"OK. Returns the updated kitchen group.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MenuKitchenGroup"}},"text/json":{"schema":{"$ref":"#/components/schemas/MenuKitchenGroup"}}}},"400":{"description":"Bad Request. Example message: `id: invalid`."},"401":{"description":"Unauthorized. Example message: `Invalid Authentication Key`."},"403":{"description":"Forbidden. Example message: `Forbidden: insufficient permissions to update`."},"404":{"description":"Not Found. Example message: `kitchenGroup not found: kitchenGroup:<id>`."},"500":{"description":"Internal Server Error. Example message: `Internal Server Error`."}},"tags":["Menu"]},"patch":{"description":"Partially update a kitchen group by ID.\nOnly fields present in the request body are updated, omitted fields remain unchanged.","operationId":"menu_kitchenGroups_patch","parameters":[{"in":"path","name":"id","description":"Base64-encoded kitchen group ID. Format: `kitchenGroup:<numeric_id>` (e.g. `a2l0Y2hlbkdyb3VwOjU4NTM=` = `kitchenGroup:5853`)","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchMenuKitchenGroup"}}},"description":"Fields to patch on the kitchen group","required":true},"responses":{"200":{"description":"Patch succeeded. No payload is returned; clients needing the new state should call `GET /v2/menu/kitchenGroups`."},"400":{"description":"Bad Request. Example message: `id: invalid`."},"401":{"description":"Unauthorized. Example message: `Invalid Authentication Key`."},"403":{"description":"Forbidden. Example message: `Forbidden: insufficient permissions to update`."},"404":{"description":"Not Found. Example message: `kitchenGroup not found: kitchenGroup:<id>`."},"500":{"description":"Internal Server Error. Example message: `Internal Server Error`."}},"tags":["Menu"]}},"/v2/menu/modifiers":{"get":{"description":"Fetch list of modifiers","operationId":"menu_modifiers","parameters":[{"in":"query","name":"showDeleted","description":"Include deleted items","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MenuModifier"}},"example":[{"id":"bW9kaWZpZXI6NDI2MDU=","name":"Pick Your Bowl Of Soup","min_choices":1,"max_choices":1,"allow_substitutes":true,"included_ingredients":1,"allow_duplicate_ingredients":false,"half_and_half":false,"ingredients":[{"ingredient_id":"aW5ncmVkaWVudDoxNzk2NzI=","price":0,"size_prices":[],"sort_order":1},{"ingredient_id":"aW5ncmVkaWVudDoxNzk2NzM=","price":0,"size_prices":[],"sort_order":0}],"available_online":false,"button_color":"#000000"},{"id":"bW9kaWZpZXI6NDI2MDQ=","name":"Pick Your Half Salad","min_choices":1,"max_choices":1,"allow_substitutes":true,"included_ingredients":0,"allow_duplicate_ingredients":true,"half_and_half":true,"ingredients":[{"ingredient_id":"aW5ncmVkaWVudDoxNzk2Njc=","price":0,"size_prices":[],"sort_order":1},{"ingredient_id":"aW5ncmVkaWVudDoxNzk2Njg=","price":0,"size_prices":[],"sort_order":2}],"available_online":true,"button_color":"#FF0000"}]}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Menu"]},"post":{"description":"Create a new modifiers","operationId":"menu_modifiers_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMenuModifier"}}},"required":true},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MenuModifierResponse"},"example":{"id":"bW9kaWZpZXI6Mjc4MjQ2"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Menu"]}},"/v2/menu/modifiers/{id}":{"patch":{"description":"Partially update an existing modifier.\nOnly fields present in the request body are updated, omitted fields remain unchanged.\nWhen `ingredients` is provided it fully replaces the existing ingredient list (including `size_prices`), an empty array clears all ingredient assignments.","operationId":"menu_modifiers_patch","parameters":[{"in":"path","name":"id","description":"ID of the modifier to update","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchMenuModifier"}}},"description":"Fields to patch on the modifier","required":true},"responses":{"200":{"description":"Patch succeeded. No payload is returned; clients needing the new state should call `GET /v2/menu/modifiers`."},"400":{"description":"Bad Request. Example message: `id: invalid`."},"401":{"description":"Unauthorized. Example message: `Invalid Authentication Key`."},"403":{"description":"Forbidden. Example message: `Forbidden: insufficient permissions to update`."},"404":{"description":"Not Found. Example message: `modifier not found: modifier:<id>`."},"500":{"description":"Internal Server Error. Example message: `Internal Server Error`."}},"tags":["Menu"]},"put":{"description":"Fully replace a modifier by ID. Only `name` is required; all other fields default if omitted (`min_choices`: 0, `max_choices`: 0, `included_ingredients`: 0, `allow_duplicate_ingredients`: false, `available_online`: true, `ingredients`: [], `button_color`: `#00755A`).","operationId":"menu_modifiers_put","parameters":[{"in":"path","name":"id","description":"Base64-encoded modifier ID. Format: `modifier:<numeric_id>` (e.g. `bW9kaWZpZXI6NDI2MDU=` = `modifier:42605`)","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PutMenuModifier"},"examples":{"example":{"value":{"name":"Sauces","min_choices":0,"max_choices":3,"included_ingredients":0,"allow_duplicate_ingredients":false,"available_online":true,"ingredients":[{"ingredient_id":"aW5ncmVkaWVudDoxMDI3NTU2","price":1.5,"size_prices":[{"size_id":"c2l6ZTo1MDk=","price":2}]}],"button_color":"#FF5733"}}}},"text/json":{"schema":{"$ref":"#/components/schemas/PutMenuModifier"}}},"description":"Modifier fields to replace (`name` required, all others optional with defaults)","required":true},"responses":{"200":{"description":"OK. Returns the updated modifier.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PutMenuModifierResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/PutMenuModifierResponse"}}}},"400":{"description":"Bad Request. Example message: `id: invalid`."},"401":{"description":"Unauthorized. Example message: `Invalid Authentication Key`."},"403":{"description":"Forbidden. Example message: `Forbidden: insufficient permissions to update`."},"404":{"description":"Not Found. Example message: `modifier not found: modifier:<id>`."},"500":{"description":"Internal Server Error. Example message: `Internal Server Error`."}},"tags":["Menu"]}},"/v2/menu/reportCategories":{"get":{"description":"Fetch list of report categories","operationId":"menu_reportCategories","parameters":[{"in":"query","name":"showDeleted","description":"Include deleted items","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MenuReportCategory"}},"example":[{"id":"cmVwb3J0Q2F0ZWdvcnk6OTUwMw==","name":"Alcohol"},{"id":"cmVwb3J0Q2F0ZWdvcnk6OTUwMg==","name":"Food"}]}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Menu"]},"post":{"description":"Create new report category","operationId":"menu_reportCategories_post","requestBody":{"$ref":"#/components/requestBodies/CreateMenuReportCategory"},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MenuReportCategory"},"example":{"id":"cmVwb3J0Q2F0ZWdvcnk6OTUwMw==","name":"Alcohol"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Menu"]}},"/v2/menu/reportCategories/{id}":{"post":{"deprecated":true,"summary":"Deprecated report category update","description":"Deprecated and removed. Updating a report category via POST is no longer supported and now returns 404. Use PUT /v2/menu/reportCategories/{id} (full replace) or PATCH /v2/menu/reportCategories/{id} (partial update) instead.","operationId":"menu_reportCategories_update","parameters":[{"in":"path","name":"id","description":"","required":true,"schema":{"type":"string"}}],"responses":{"404":{"description":"Not Found - Cannot POST /v2/menu/reportCategories/{id}; use PUT or PATCH instead."}},"tags":["Menu"]},"patch":{"description":"Partially update an existing report category. Only provided fields will be updated.","operationId":"menu_reportCategories_patch","parameters":[{"in":"path","name":"id","description":"Base64-encoded report category ID. Format: `reportCategory:<numeric_id>` (e.g. `cmVwb3J0Q2F0ZWdvcnk6OTUwMw==` = `reportCategory:9503`)","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchMenuReportCategory"}}},"description":"Fields to update","required":true},"responses":{"200":{"description":"Patch succeeded. No payload is returned; clients needing the new state should call GET /v2/menu/reportCategories."},"400":{"description":"Bad Request. Possible error messages include:\n- id is invalid\n- name: String must contain at least 1 character(s)"},"401":{"description":"Unauthorized. Possible causes include:\n- Missing API key\n- Missing or expired token"},"403":{"description":"Invalid API Key"},"404":{"description":"Report category not found"},"500":{"description":"Internal server error"}},"tags":["Menu"]},"put":{"description":"Fully replace an existing report category. `name` is required.","operationId":"menu_reportCategories_put","parameters":[{"in":"path","name":"id","description":"Base64-encoded report category ID. Format: `reportCategory:<numeric_id>` (e.g. `cmVwb3J0Q2F0ZWdvcnk6OTUwMw==` = `reportCategory:9503`)","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"description":"Report category fields to replace (`name` required)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PutMenuReportCategory"},"example":{"name":"Alcohol"}}}},"responses":{"200":{"description":"OK. Returns the updated report category.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MenuReportCategory"},"example":{"id":"cmVwb3J0Q2F0ZWdvcnk6OTUwMw==","name":"Alcohol"}}}},"400":{"description":"Bad Request. Possible error messages include:\n- id is invalid\n- name: Required\n- name: String must contain at least 1 character(s)"},"401":{"description":"Unauthorized. Possible causes include:\n- Missing API key\n- Missing or expired token"},"403":{"description":"Invalid API Key"},"404":{"description":"Report category not found"},"500":{"description":"Internal server error"}},"tags":["Menu"]}},"/v2/menu/revenueCenters":{"get":{"description":"Fetch list of revenue centers","operationId":"menu_revenueCenters","parameters":[{"in":"query","name":"showDeleted","description":"Include deleted items","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MenuRevenueCenter"}},"example":[{"id":"cmV2ZW51ZUNlbnRlcjo2NTUz","name":"Delivery Center"},{"id":"cmV2ZW51ZUNlbnRlcjoxOQ==","name":"Adjustments"}]}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Menu"]},"post":{"description":"Create a new revenue center","operationId":"menu_revenueCenters_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateRevenueCenters"}}},"required":true},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseRevenueCenters"},"example":{"id":"cmV2ZW51ZUNlbnRlcjo2NTUz"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Menu"]}},"/v2/menu/sections":{"get":{"description":"Fetch list of sections","operationId":"menu_sections","parameters":[{"in":"query","name":"showDeleted","description":"Include deleted items","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MenuSection"}},"example":[{"id":"c2VjdGlvbjoyNzYxNw==","name":"Beverages","items":[{"item_id":"aXRlbToyOTU5MDM=","sort_order":1749620847},{"item_id":"aXRlbToyOTgzNjY=","sort_order":1749620848}],"available_online":false},{"id":"c2VjdGlvbjoyNzgxNA==","name":"Combos","items":[{"item_id":"aXRlbToyOTgzMzU=","sort_order":1749620847},{"item_id":"aXRlbToyOTgzNTc=","sort_order":1749620848}],"available_online":true}]}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Menu"]},"post":{"description":"Create a new section","operationId":"menu_sections_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMenuSection"}}},"required":true},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseMenuSection"},"example":{"id":"c2VjdGlvbjoyNzYxNw=="}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Menu"]}},"/v2/menu/sections/{id}":{"patch":{"description":"Partially update a section by ID. Only fields present in the request body are updated. For items: omit to leave unchanged, provide non-empty array to replace all, provide empty array to remove all.","operationId":"menu_sections_patch","parameters":[{"in":"path","name":"id","description":"Base64-encoded section ID. Format: `section:<numeric_id>` (e.g. `c2VjdGlvbjoyNzYxNw==` = `section:27617`)","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchMenuSection"},"examples":{"full_update":{"summary":"Update all supported fields","value":{"name":"Appetizers","items":[{"item_id":"aXRlbToyOTU5MDM="},{"item_id":"aXRlbToyOTgzNjY="}],"available_online":true}},"rename":{"summary":"Rename section","value":{"name":"Appetizers"}},"replace_items":{"summary":"Replace items","value":{"items":[{"item_id":"aXRlbToyOTU5MDM="},{"item_id":"aXRlbToyOTgzNjY="}]}},"clear_items":{"summary":"Clear all items","value":{"items":[]}},"toggle_online":{"summary":"Toggle available_online","value":{"available_online":true}}}}},"description":"Fields to update (at least one required)","required":true},"responses":{"200":{"description":"OK. Returns status only (no response body)."},"400":{"description":"Bad Request. Returned when: id is invalid, body is empty, name is empty string, item_id is invalid/non-base64, or item_id has duplicate values."},"401":{"description":"Unauthorized. Example message: `Invalid Authentication Key`."},"403":{"description":"Forbidden. Returned when section is shared across multiple locations."},"404":{"description":"Not Found. Returned when section or referenced item does not exist."},"500":{"description":"Internal Server Error."}},"tags":["Menu"]},"put":{"description":"Fully replace a section by ID. Uses replacement semantics: `name` is required; omitted optional fields reset to defaults (`items`: empty array, `available_online`: true).","operationId":"menu_sections_put","parameters":[{"in":"path","name":"id","description":"Base64-encoded section ID. Format: `section:<numeric_id>` (e.g. `c2VjdGlvbjoyNzYxNw==` = `section:27617`)","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"description":"Section fields to replace (`name` required, others optional with defaults)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PutMenuSection"},"examples":{"full":{"summary":"Full update with all fields","value":{"name":"Lunch Specials","items":[{"item_id":"aXRlbToyOTU5MDM="},{"item_id":"aXRlbToyOTgzNjY="}],"available_online":true}},"name_only":{"summary":"Name only — omitted fields reset to defaults","value":{"name":"Lunch Specials"}},"clear_items":{"summary":"Explicit empty items","value":{"name":"Empty Section","items":[],"available_online":true}}}}}},"responses":{"200":{"description":"OK. Returns the updated section.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MenuSection"},"example":{"id":"c2VjdGlvbjoyNzYxNw==","name":"Lunch Specials","items":[{"item_id":"aXRlbToyOTU5MDM=","sort_order":1749620847},{"item_id":"aXRlbToyOTgzNjY=","sort_order":1749620848}],"available_online":true}}}},"400":{"description":"Bad Request. Example messages: `id: invalid`, `name: Required`, `name: String must contain at least 1 character(s)`."},"401":{"description":"Unauthorized. Example message: `Invalid Authentication Key`."},"403":{"description":"Forbidden. Returned when section is shared across multiple locations."},"404":{"description":"Not Found. Example message: `section not found: <id>`."},"500":{"description":"Internal Server Error."}},"tags":["Menu"]}},"/v2/menu/sizes":{"get":{"description":"Fetch list of sizes","operationId":"menu_sizes","parameters":[{"in":"query","name":"showDeleted","description":"Include deleted items","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MenuSize"}},"example":[{"id":"c2l6ZToxMTQ4NA==","name":"Bowl","short_name":"","available_online":false},{"id":"c2l6ZToxMTQ4Mw==","name":"Cup","short_name":"","available_online":true}]}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Menu"]},"post":{"description":"Create a new size","operationId":"menu_sizes_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMenuSize"}}},"required":true},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MenuSizeResponse"},"example":{"id":"c2l6ZToxMTQ4NA=="}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Menu"]}},"/v2/menu/sizes/{id}":{"post":{"deprecated":true,"description":"Deprecated and removed. Updating a size via POST is no longer supported and now returns 404. Use PUT /v2/menu/sizes/{id} (full replace) or PATCH /v2/menu/sizes/{id} (partial update) instead.","operationId":"menu_sizes_update","parameters":[{"in":"path","name":"id","description":"","required":true,"schema":{"type":"string"}}],"responses":{"404":{"description":"Not Found - POST-based size update has been removed; use PUT or PATCH instead."}},"tags":["Menu"]},"patch":{"description":"Partially update an existing size","operationId":"menu_sizes_patch","parameters":[{"in":"path","name":"id","description":"Unique ID of size","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchMenuSize"}}},"description":"Fields to update. All fields are optional."},"responses":{"200":{"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"description":"Forbidden"},"404":{"description":"Size not found"},"500":{"description":"Internal Server Error"}},"tags":["Menu"]},"put":{"description":"Fully replace a size by ID. Only `name` is required; `short_name` defaults to `\"\"` and `available_online` defaults to `true` if omitted.","operationId":"menu_sizes_put","parameters":[{"in":"path","name":"id","description":"Base64-encoded size ID. Format: `size:<numeric_id>` (e.g. `c2l6ZToxMTQ4NA==` = `size:11484`)","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PutMenuSize"},"examples":{"example":{"value":{"name":"Large","short_name":"LG","available_online":true}}}}},"description":"Size fields to replace (`name` required; `short_name` defaults to `\"\"`, `available_online` defaults to `true`)","required":true},"responses":{"200":{"description":"OK. Returns the updated size.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PutMenuSizeResponse"},"examples":{"response":{"value":{"id":"c2l6ZToxMTQ4NA==","name":"Large","short_name":"LG","available_online":true}}}}}},"400":{"description":"Bad Request. Example: `id: invalid` or `name: String must contain at least 1 character(s)`."},"401":{"description":"Unauthorized."},"403":{"description":"Forbidden."},"404":{"description":"Size not found."}},"tags":["Menu"]}},"/v2/menu/tags":{"get":{"description":"Fetch list of tags","operationId":"menu_tags","parameters":[{"in":"query","name":"showDeleted","description":"Include deleted items","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MenuTag"}},"example":[{"id":"dGFnOjI3MjM=","name":"Alcohol Tax"},{"id":"dGFnOjI3ODI=","name":"BOGO Half Off Sandwich"}]}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Menu"]},"post":{"description":"Create a new tag","operationId":"menu_tags_post","requestBody":{"$ref":"#/components/requestBodies/CreateMenuTag"},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MenuTag"},"example":{"id":"dGFnOjI3MjM=","name":"Alcohol Tax"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Menu"]}},"/v2/menu/tags/{id}":{"post":{"deprecated":true,"description":"Deprecated and removed. Updating a tag via POST is no longer supported and now returns 404. Use PUT /v2/menu/tags/{id} (full replace) or PATCH /v2/menu/tags/{id} (partial update) instead.","operationId":"menu_tags_update","parameters":[{"in":"path","name":"id","description":"","required":true,"schema":{"type":"string"}}],"responses":{"404":{"description":"Not Found - Cannot POST /v2/menu/tags/{id}; use PUT or PATCH instead."}},"tags":["Menu"]},"patch":{"description":"Partially update an existing tag.","operationId":"menu_tags_patch","parameters":[{"in":"path","name":"id","description":"ID of the tag to update","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchMenuTag"}}},"description":"Fields to patch on the tag","required":true},"responses":{"200":{"description":"Patch succeeded. No payload is returned; clients needing the new state should call `GET /v2/menu/tags`."},"400":{"description":"Bad Request. Example message: `id: invalid`."},"401":{"description":"Unauthorized. Example message: `Invalid Authentication Key`."},"403":{"description":"Forbidden. Example message: `Forbidden: insufficient permissions to update`."},"404":{"description":"Not Found. Example message: `tag not found: tag:<id>`."},"500":{"description":"Internal Server Error. Example message: `Internal Server Error`."}},"tags":["Menu"]},"put":{"description":"Full-replacement update of a tag. `name` is required.","operationId":"menu_tags_put","parameters":[{"in":"path","name":"id","description":"Base64-encoded tag id (e.g. \"dGFnOjI3MjM=\")","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"description":"Tag fields to replace. `name` is required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PutMenuTag"},"examples":{"full":{"summary":"Full update (name)","value":{"name":"Seasonal"}}}}}},"responses":{"200":{"description":"OK. Returns the updated tag payload (same shape as GET).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MenuTag"},"example":{"id":"dGFnOjI3MjM=","name":"Seasonal"}}}},"400":{"description":"Bad Request. Examples: request body missing/invalid JSON; `name` missing or empty; unrecognized field in body."},"401":{"description":"Unauthorized. Missing `x-api-key` or missing/invalid `Authentication` token."},"403":{"description":"Forbidden. API key is invalid or caller lacks permission to update this tag."},"404":{"description":"Not Found. Example message: `tag not found: tag:<id>`."},"500":{"description":"Internal Server Error. Example message: `Internal Server Error`."}},"tags":["Menu"]}},"/v2/menu/taxes":{"get":{"description":"Fetch list of taxes","operationId":"menu_taxes","parameters":[{"in":"query","name":"showDeleted","description":"Include deleted items","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MenuTax"}},"example":[{"id":"dGF4OjE0NjQ=","name":"Alcohol Tax","rate":20},{"id":"dGF4OjE0NjI=","name":"Food Tax","rate":10}]}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Menu"]},"post":{"description":"Create a new tax","operationId":"menu_taxes_post","requestBody":{"$ref":"#/components/requestBodies/CreateMenuTax"},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MenuTax"},"example":{"id":"dGF4OjE0NjQ=","name":"Alcohol Tax","rate":20}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Menu"]}},"/v2/menu/taxes/{id}":{"post":{"deprecated":true,"description":"Deprecated and removed. Updating a taxes via POST is no longer supported and now returns 404. Use PUT /v2/menu/taxes/{id} (full replace) or PATCH /v2/menu/taxes/{id} (partial update) instead.","operationId":"menu_taxes_update","parameters":[{"in":"path","name":"id","description":"","required":true,"schema":{"type":"string"}}],"responses":{"404":{"description":"Not Found - POST-based taxes update has been removed; use PUT or PATCH instead."}},"tags":["Menu"]},"patch":{"description":"Partially update an existing tax","operationId":"menu_taxes_patch","parameters":[{"in":"path","name":"id","description":"Base64-encoded menu tax id (e.g. \"VGF4OjAwMDE=\")","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchMenuTax"},"examples":{"patch_name_and_rate":{"summary":"Patch name and rate","value":{"name":"County Tax","rate":3.7}},"patch_name":{"summary":"Patch name","value":{"name":"State Sales Tax"}},"patch_rate":{"summary":"Patch rate","value":{"rate":8.25}}}}}},"responses":{"200":{"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"}},"tags":["Menu"]},"put":{"description":"Full-replacement update of a tax record. `name` is required; if `rate` is omitted it is reset to `0`.","operationId":"menu_taxes_put","parameters":[{"in":"path","name":"id","description":"Base64-encoded tax id (e.g. \"dGF4OjE0NjQ=\")","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"description":"Tax fields to replace. `name` is required; omitting `rate` resets it to `0`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PutMenuTax"},"examples":{"full":{"summary":"Full update (name + rate)","value":{"name":"Sales Tax","rate":8.25}},"name_only":{"summary":"Name only — rate resets to 0","value":{"name":"Reduced Tax"}}}}}},"responses":{"200":{"description":"OK. Returns the updated tax payload (same shape as GET).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MenuTax"},"example":{"id":"dGF4OjE0NjQ=","name":"Sales Tax","rate":8.25}}}},"400":{"description":"Bad Request. Examples: request body missing/invalid JSON; `name` missing or empty; `rate` wrong type or out of range; unrecognized field in body."},"401":{"description":"Unauthorized. Missing `x-api-key` or missing/invalid `Authentication` token."},"403":{"description":"Forbidden. API key is invalid or caller lacks permission to update this tax."},"404":{"description":"Not Found. Tax `{id}` does not exist or is not accessible in the current merchant/location context."}},"tags":["Menu"]}},"/v2/menu/dayparts":{"get":{"description":"Fetch list of dayparts","operationId":"menu_dayparts_get","parameters":[{"in":"query","name":"showDeleted","description":"Include deleted items","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MenuDayparts"}},"example":[{"id":"ZGF5cGFydDo4ODk2","name":"test-daypart-1"},{"id":"ZGF5cGFydDo3Njk0","name":"test-daypart-2"}]}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Menu"]},"post":{"description":"Create a new daypart","operationId":"menu_dayparts_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMenuDayparts"}}},"required":true},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MenuDayparts"},"example":{"id":"ZGF5cGFydDo4ODk2","name":"dayparts"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Menu"]}},"/v2/menu/dayparts/{id}":{"post":{"deprecated":true,"summary":"Deprecated daypart update","description":"Deprecated and removed. Updating a daypart via POST is no longer supported and now returns 404. Use PUT /v2/menu/dayparts/{id} (full replace) or PATCH /v2/menu/dayparts/{id} (partial update) instead.","operationId":"menu_dayparts_update","parameters":[{"in":"path","name":"id","description":"","required":true,"schema":{"type":"string"}}],"responses":{"404":{"description":"Not Found - Cannot POST /v2/menu/dayparts/{id}; use PUT or PATCH instead."}},"tags":["Menu"]},"patch":{"description":"Partially update an existing daypart. Only provided fields will be updated.","operationId":"menu_dayparts_patch","parameters":[{"in":"path","name":"id","description":"Base64-encoded daypart id (e.g. ZGF5cGFydDo4ODk2)","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchMenuDayparts"}}},"description":"Fields to update (all optional)","required":true},"responses":{"200":{"description":"Patch succeeded. No payload is returned; clients needing the new state should call `GET /v2/menu/dayparts`."},"400":{"description":"Bad Request. Possible error messages include:\n- id: invalid\n- name: String must contain at least 1 character(s)\n- name: Expected string, received number"},"401":{"description":"Unauthorized. Possible causes include:\n- Missing API key\n- Missing or expired token"},"403":{"description":"Invalid API Key"},"404":{"description":"Daypart not found"},"500":{"description":"Internal server error"}},"tags":["Menu"]},"put":{"description":"Full-replacement update of a daypart. `name` is required.","operationId":"menu_dayparts_put","parameters":[{"in":"path","name":"id","description":"Base64-encoded daypart id (e.g. ZGF5cGFydDo4ODk2)","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"description":"Daypart fields to replace. `name` is required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PutMenuDayparts"},"examples":{"full":{"summary":"Full update","value":{"name":"Lunch"}}}}}},"responses":{"200":{"description":"OK. Returns the updated daypart.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MenuDayparts"},"example":{"id":"ZGF5cGFydDo4ODk2","name":"Lunch"}}}},"400":{"description":"Bad Request. Example messages: `id: invalid`, `name: Required`, `name: String must contain at least 1 character(s)`, or unrecognized field in body."},"401":{"description":"Unauthorized. Example message: `Invalid Authentication Key`."},"403":{"description":"Forbidden. API key is invalid or caller lacks permission to update this daypart."},"404":{"description":"Not Found. Example message: `daypart not found: <id>`."},"500":{"description":"Internal Server Error."}},"tags":["Menu"]}},"/v2/orders":{"post":{"summary":"Create a new order","description":"Use this endpoint to create a new online order. To validate your order prior to submission, use `/v2/orders/validate`.","operationId":"orders_post","requestBody":{"$ref":"#/components/requestBodies/Orders"},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"description":"Base64-encoded GraphQL ID of the created order, in the form `base64(\"orderId:<OrderID>\")`.","type":"string"}}},"example":{"id":"b3JkZXJJZDowNkM5QTUxRC1BOUJELTRENzYtOURDRS1GRDU2OUVFREVGNDc="}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"409":{"description":"Conflict - an order with the same `partner_order_id` already exists for this merchant."}},"tags":["Orders"]}},"/v2/orders/{startDate}/{endDate}":{"get":{"summary":"List closed orders for a date range (paginated)","description":"Returns closed orders for the inclusive `startDate`..`endDate` business-date range. The range must not exceed 14 days. For orders placed on the POS, delivery-related fields (address, delivery instructions, promised time) are not populated.","operationId":"orders_list","parameters":[{"in":"path","name":"startDate","description":"Start of the inclusive business-date range (YYYY-MM-DD).","required":true,"schema":{"type":"string","format":"date"}},{"in":"path","name":"endDate","description":"End of the inclusive business-date range (YYYY-MM-DD).","required":true,"schema":{"type":"string","format":"date"}},{"in":"query","name":"page","description":"Page number (starts from 1). Defaults to 1 when omitted.","required":false,"schema":{"type":"integer","minimum":1,"default":1}},{"in":"query","name":"limit","description":"Number of orders per page. Defaults to 50 when omitted. Maximum 100.","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":50}}],"responses":{"200":{"description":"OK. A paginated list of full order objects. Always returns the `data` array and `pagination` metadata, even when the range contains no orders.","content":{"application/json":{"schema":{"type":"object","required":["data","pagination"],"properties":{"data":{"type":"array","description":"Full order objects for the current page, matching the `GET /v2/orders/{id}` response shape.","items":{"$ref":"#/components/schemas/Order"}},"pagination":{"type":"object","required":["total","page","limit","total_pages"],"properties":{"total":{"description":"Total number of matching closed orders across all pages","type":"integer"},"page":{"description":"Current page number (starts from 1)","type":"integer"},"limit":{"description":"Number of orders per page","type":"integer"},"total_pages":{"description":"Total number of pages (0 when there are no results)","type":"integer"}}}}},"example":{"data":[{"subtotal":12,"total":12.96,"ticket_number":"OLO1","staff_id":1390616,"status":1,"ticket_status":"Closed","guest_count":1,"room_id":124632,"partner_order_id":null,"customer_info":{"name":"Brandon K","phone":"18647749870","address":"","suite":"","city":"","state":"","zip":"","email":""},"id":"dGlja2V0OkRCOTcwQ0U5LUI3MjEtNEM4MS05NkEwLTIxNkEwM0FCNjgzMQ==","opened_dt":"2026-06-30T15:47:17+00:00","closed_dt":"2026-06-30T16:31:02+00:00","job_type_id":"am9iVHlwZToxOTI2MTg=","created_by_staff_id":"c3RhZmY6MA==","daypart_id":"","seat_count":0,"paid_status":"paid_in_full","business_name":"null","delivery_instructions":"","promise_dt":"1782836400","table":{"id":"null","name":"null"},"revenue_center_id":null,"alternate_id":"null","net_sales":"12.00","gross_sales":"12.00","tax_exempt":"false","adjustments":[{"adjustmentName":"10% Discount","total":"-1.20","id":"dF9BZGp1c3RtZW50OjEyMzQ1","added_dt":"2026-06-30T15:47:17+00:00","voided_dt":"","adjustment_id":"YWRqdXN0bWVudDoxMjM0NQ==","non_revenue":"false","tax_exempt":"false","service_charge":"false"}],"items":[{"itemName":"Spaghetti and Meatballs","subtotal":12,"total":12,"id":"dF9JdGVtOkIzMzBGQkVBLTYxMTMtNDgxMS05NjU3LTg3NkNGQkUzQUI0RQ==","added_dt":"2026-06-30T15:47:17+00:00","description":"","voided_dt":"","void_staff_id":"c3RhZmY6MA==","course":0,"seat":0,"item_id":"aXRlbTo5MjYwODc4","size_id":"c2l6ZTow","section_id":"c2VjdGlvbjo3MDA4MDg=","group_id":"Z3JvdXA6MTQwNDYx","discount_id":"ZGlzY291bnQ6MA==","discount_price":"0.00","auto_discount_price":"0.00","sub_item":"false","parent_id":"","non_revenue":"false","tax_exempt":"false","quantity":1,"measured_amount":0,"measurement_type":"not_measured","cost":"0.00","net_sales":"12.00","gross_sales":"12.00","gift_card":"false"}],"taxes":[{"price":0.96,"id":"dF9UYXg6MjY3ODVFNjYtMUJCMi00RkVGLTMxM0YtQTQ0MUZBREI0MDEx","name":"Sales Tax","tax_id":"dGF4OjM1OTE0","total_inclusive":"0.00"}],"transactions":[{"amount":12.96,"tip":0,"total":12.96,"id":"dGlja2V0VHJhbnM6MjA4NzFFMDAtMjE5OC00RkFDLUFFMTctNDA3NjJFNzQ3NEMz","added_dt":"2026-06-30T15:47:17+00:00","void_dt":"","staff_id":"c3RhZmY6MA==","type":"house_account","status":"sale","card_type":"","card_num":null,"card_name":null,"house_account_id":"aG91c2VBY2NvdW50OjEzNzg2Mg==","ref":0,"additional_info":{"reference":null}}],"ingredients":[{"id":"dF9JbmdyZWRpZW50OkVENTVGNEZELTMxRkUtNEMwQi1CQ0I0LUYzMkI5OTdFMjdFRg==","name":"Meatballs","added_dt":"2026-06-30T15:47:17+00:00","void_dt":"","ticket_item_id":"dF9JdGVtOkIzMzBGQkVBLTYxMTMtNDgxMS05NjU3LTg3NkNGQkUzQUI0RQ==","item_id":"aXRlbTo5MjYwODc4","size_id":"c2l6ZTow","section_id":"c2VjdGlvbjo3MDA4MDg=","group_id":"Z3JvdXA6MTQwNDYx","modifier_id":"bW9kaWZpZXI6MTM3NDAyMw==","ingredient_id":"aW5ncmVkaWVudDo1MDcwODk4","default_on":"true","price":"0.00"}],"removed_ingredients":[{"id":"dF9JbmdyZWRpZW50OjlGQTQyRTMxLThCMzItNDFCMS05OUE3LTMzMzJGQTc3MTJDOQ==","name":"Shaved Parmigiana","added_dt":"2026-06-30T15:47:17+00:00","void_dt":"","ticket_item_id":"dF9JdGVtOkIzMzBGQkVBLTYxMTMtNDgxMS05NjU3LTg3NkNGQkUzQUI0RQ==","item_id":"aXRlbTo5MjYwODc4","size_id":"c2l6ZTow","section_id":"c2VjdGlvbjo3MDA4MDg=","group_id":"Z3JvdXA6MTQwNDYx","modifier_id":"bW9kaWZpZXI6MTM3NDAyMw==","ingredient_id":"aW5ncmVkaWVudDo1MDcwODQz","default_on":"true","price":"0.00"}]}],"pagination":{"total":1,"page":1,"limit":50,"total_pages":1}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Orders"]}},"/v2/orders/{id}":{"get":{"summary":"Fetch order details by order id","description":"Use this endpoint to get full order details including totals, items, adjustments, taxes, transactions, ingredients and order status. Works for any order type and status. The response includes both the original API fields and the full ticket representation matching the `ticket.all` webhook structure. For orders placed on the POS, delivery-related fields (address, delivery instructions, promised time) are not populated.","operationId":"orders_get","parameters":[{"in":"path","name":"id","description":"Base64-encoded order reference. Accepts the order ID returned by the Orders API (decoded format: `orderId:<id>`) or the ticket ID returned by the `ticket.all` webhook (decoded format: `ticket:<id>`).","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Order"},"example":{"subtotal":12,"total":12.96,"ticket_number":"OLO1","staff_id":1390616,"status":1,"ticket_status":"Closed","guest_count":1,"room_id":124632,"partner_order_id":null,"customer_info":{"name":"Brandon K","phone":"18647749870","address":"","suite":"","city":"","state":"","zip":"","email":""},"id":"dGlja2V0OkRCOTcwQ0U5LUI3MjEtNEM4MS05NkEwLTIxNkEwM0FCNjgzMQ==","opened_dt":"2026-06-30T15:47:17+00:00","closed_dt":"2026-06-30T16:31:02+00:00","job_type_id":"am9iVHlwZToxOTI2MTg=","created_by_staff_id":"c3RhZmY6MA==","daypart_id":"","seat_count":0,"paid_status":"paid_in_full","business_name":"null","delivery_instructions":"","promise_dt":"1782836400","table":{"id":"null","name":"null"},"revenue_center_id":null,"alternate_id":"null","net_sales":"12.00","gross_sales":"12.00","tax_exempt":"false","adjustments":[{"adjustmentName":"10% Discount","total":"-1.20","id":"dF9BZGp1c3RtZW50OjEyMzQ1","added_dt":"2026-06-30T15:47:17+00:00","voided_dt":"","adjustment_id":"YWRqdXN0bWVudDoxMjM0NQ==","non_revenue":"false","tax_exempt":"false","service_charge":"false"}],"items":[{"itemName":"Spaghetti and Meatballs","subtotal":12,"total":12,"id":"dF9JdGVtOkIzMzBGQkVBLTYxMTMtNDgxMS05NjU3LTg3NkNGQkUzQUI0RQ==","added_dt":"2026-06-30T15:47:17+00:00","description":"","voided_dt":"","void_staff_id":"c3RhZmY6MA==","course":0,"seat":0,"item_id":"aXRlbTo5MjYwODc4","size_id":"c2l6ZTow","section_id":"c2VjdGlvbjo3MDA4MDg=","group_id":"Z3JvdXA6MTQwNDYx","discount_id":"ZGlzY291bnQ6MA==","discount_price":"0.00","auto_discount_price":"0.00","sub_item":"false","parent_id":"","non_revenue":"false","tax_exempt":"false","quantity":1,"measured_amount":0,"measurement_type":"not_measured","cost":"0.00","net_sales":"12.00","gross_sales":"12.00","gift_card":"false"}],"taxes":[{"price":0.96,"id":"dF9UYXg6MjY3ODVFNjYtMUJCMi00RkVGLTMxM0YtQTQ0MUZBREI0MDEx","name":"Sales Tax","tax_id":"dGF4OjM1OTE0","total_inclusive":"0.00"}],"transactions":[{"amount":12.96,"tip":0,"total":12.96,"id":"dGlja2V0VHJhbnM6MjA4NzFFMDAtMjE5OC00RkFDLUFFMTctNDA3NjJFNzQ3NEMz","added_dt":"2026-06-30T15:47:17+00:00","void_dt":"","staff_id":"c3RhZmY6MA==","type":"house_account","status":"sale","card_type":"","card_num":null,"card_name":null,"house_account_id":"aG91c2VBY2NvdW50OjEzNzg2Mg==","ref":0,"additional_info":{"reference":null}}],"ingredients":[{"id":"dF9JbmdyZWRpZW50OkVENTVGNEZELTMxRkUtNEMwQi1CQ0I0LUYzMkI5OTdFMjdFRg==","name":"Meatballs","added_dt":"2026-06-30T15:47:17+00:00","void_dt":"","ticket_item_id":"dF9JdGVtOkIzMzBGQkVBLTYxMTMtNDgxMS05NjU3LTg3NkNGQkUzQUI0RQ==","item_id":"aXRlbTo5MjYwODc4","size_id":"c2l6ZTow","section_id":"c2VjdGlvbjo3MDA4MDg=","group_id":"Z3JvdXA6MTQwNDYx","modifier_id":"bW9kaWZpZXI6MTM3NDAyMw==","ingredient_id":"aW5ncmVkaWVudDo1MDcwODk4","default_on":"true","price":"0.00"}],"removed_ingredients":[{"id":"dF9JbmdyZWRpZW50OjlGQTQyRTMxLThCMzItNDFCMS05OUE3LTMzMzJGQTc3MTJDOQ==","name":"Shaved Parmigiana","added_dt":"2026-06-30T15:47:17+00:00","void_dt":"","ticket_item_id":"dF9JdGVtOkIzMzBGQkVBLTYxMTMtNDgxMS05NjU3LTg3NkNGQkUzQUI0RQ==","item_id":"aXRlbTo5MjYwODc4","size_id":"c2l6ZTow","section_id":"c2VjdGlvbjo3MDA4MDg=","group_id":"Z3JvdXA6MTQwNDYx","modifier_id":"bW9kaWZpZXI6MTM3NDAyMw==","ingredient_id":"aW5ncmVkaWVudDo1MDcwODQz","default_on":"true","price":"0.00"}]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Orders"]}},"/v2/orders/validate":{"post":{"summary":"Validate and calculate an order before submitting","description":"Use this endpoint with the same data as the POST to `/v2/orders` to check that the order is valid. The endpoint will also return the calculated price.","operationId":"orders_validate_post","requestBody":{"$ref":"#/components/requestBodies/Orders"},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"subtotal":{"description":"Calculated order subtotal before taxes, as a decimal string.","type":"string"},"taxes":{"description":"Calculated total tax amount for the order.","type":"number"},"total":{"description":"Calculated order total including taxes, as a decimal string.","type":"string"},"tip":{"description":"Tip amount included in the order calculation, as a decimal string.","type":"string"}}},"example":{"subtotal":"19","taxes":0,"total":"19","tip":"0.00"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"409":{"description":"Conflict - an order with the same `partner_order_id` already exists for this merchant."}},"tags":["Orders"]}},"/v2/orders/status":{"get":{"summary":"Check store order readiness","description":"Returns whether the store's online-ordering tablet is assigned and currently online, a single can-receive-orders signal, and per-order-type accepting status with estimated prep time.\n\n**Point-in-time snapshot**: A tablet can drop offline between this check and order submission, so this endpoint reduces failed submissions but does not guarantee delivery.\n\n**Note on accepting logic**: Use `can_receive_orders && accepting` as the definitive \"safe to send\" signal. `accepting` is `true` only when the order type is enabled *and* the order type is currently in an active window.","operationId":"orders_status_get","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderStatus"},"example":{"assigned_tablet":true,"tablet_status":"connected","can_receive_orders":true,"order_types":[{"type":"carryout","accepting":true,"prep_time_minutes":15},{"type":"delivery","accepting":false,"prep_time_minutes":30},{"type":"eat-in","accepting":false,"prep_time_minutes":0}]}}}},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Orders"]}},"/v2/reports/sales/adjustments/{startDate}/{endDate}":{"get":{"description":"Fetch sales adjustment totals","operationId":"reports_sales_adjustments","parameters":[{"in":"path","name":"startDate","description":"YYYY-MM-DD","required":true,"schema":{"type":"string","format":"date"}},{"in":"path","name":"endDate","description":"YYYY-MM-DD","required":true,"schema":{"type":"string","format":"date"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SalesAdjustment"}},"example":[{"adjustment_id":"YWRqdXN0bWVudDo2NTUz","quantity":2,"total":50},{"adjustment_id":"YWRqdXN0bWVudDo2NTUw","quantity":10,"total":-25.5}]}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Sales"]}},"/v2/reports/sales/dayparts/{startDate}/{endDate}":{"get":{"description":"Fetch sales daypart totals","operationId":"reports_sales_dayparts","parameters":[{"in":"path","name":"startDate","description":"YYYY-MM-DD","required":true,"schema":{"type":"string","format":"date"}},{"in":"path","name":"endDate","description":"YYYY-MM-DD","required":true,"schema":{"type":"string","format":"date"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SalesDaypart"}},"example":[{"daypart_id":"ZGF5cGFydDo2NzM","quantity":361,"seat_count":220,"guest_count":316,"net_sales":7374.8,"gross_sales":7784.72},{"daypart_id":"ZGF5cGFydDo2NzU","quantity":511,"seat_count":311,"guest_count":425,"net_sales":29965.5,"gross_sales":30381.31}]}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Sales"]}},"/v2/reports/sales/discounts/{startDate}/{endDate}":{"get":{"description":"Fetch sales discount totals","operationId":"reports_sales_discounts","parameters":[{"in":"path","name":"startDate","description":"YYYY-MM-DD","required":true,"schema":{"type":"string","format":"date"}},{"in":"path","name":"endDate","description":"YYYY-MM-DD","required":true,"schema":{"type":"string","format":"date"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SalesDiscount"}},"example":[{"discount_id":"ZGlzY291bnQ6NTAzMw==","quantity":11,"total":-22},{"discount_id":"ZGlzY291bnQ6NDk2OA==","quantity":3,"total":-18.2}]}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Sales"]}},"/v2/reports/sales/groups/{startDate}/{endDate}":{"get":{"description":"Fetch sales group totals","operationId":"reports_sales_groups","parameters":[{"in":"path","name":"startDate","description":"YYYY-MM-DD","required":true,"schema":{"type":"string","format":"date"}},{"in":"path","name":"endDate","description":"YYYY-MM-DD","required":true,"schema":{"type":"string","format":"date"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SalesGroup"}},"example":[{"group_id":"Z3JvdXA6NTc1NQ==","quantity":10,"net_sales":47.47,"gross_sales":51.97},{"group_id":"Z3JvdXA6NTgxMg==","quantity":116,"net_sales":2183.78,"gross_sales":2185.17}]}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Sales"]}},"/v2/reports/sales/hourlyItems/{startDate}/{endDate}":{"get":{"description":"Fetch hourly sales item totals","operationId":"reports_sales_hourly_items","parameters":[{"in":"path","name":"startDate","description":"YYYY-MM-DD","required":true,"schema":{"type":"string","format":"date"}},{"in":"path","name":"endDate","description":"YYYY-MM-DD","required":true,"schema":{"type":"string","format":"date"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SalesHourlyItem"}},"example":[{"hour":10,"quantity":12,"net_sales":32.47,"gross_sales":36.98},{"hour":11,"quantity":12,"net_sales":75.44,"gross_sales":75.94}]}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Sales"]}},"/v2/reports/sales/hourlyTickets/{startDate}/{endDate}":{"get":{"description":"Fetch hourly sales ticket totals","operationId":"reports_sales_hourly_tickets","parameters":[{"in":"path","name":"startDate","description":"YYYY-MM-DD","required":true,"schema":{"type":"string","format":"date"}},{"in":"path","name":"endDate","description":"YYYY-MM-DD","required":true,"schema":{"type":"string","format":"date"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SalesHourlyTicket"}},"example":[{"hour":10,"quantity":3,"seat_count":11,"guest_count":3,"net_sales":32.47,"gross_sales":36.98},{"hour":11,"quantity":4,"seat_count":8,"guest_count":4,"net_sales":80.39,"gross_sales":80.94}]}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Sales"]}},"/v2/reports/sales/items/{startDate}/{endDate}":{"get":{"description":"Fetch sales item totals","operationId":"reports_sales_items","parameters":[{"in":"path","name":"startDate","description":"YYYY-MM-DD","required":true,"schema":{"type":"string","format":"date"}},{"in":"path","name":"endDate","description":"YYYY-MM-DD","required":true,"schema":{"type":"string","format":"date"}},{"in":"query","name":"page","description":"Page number (starts from 1). When provided with limit, returns paginated response.","required":false,"schema":{"type":"integer","minimum":1}},{"in":"query","name":"limit","description":"Number of items per page. When provided with page, returns paginated response.","required":false,"schema":{"type":"integer","minimum":1}}],"responses":{"200":{"description":"OK. This endpoint supports two response formats depending on whether pagination query parameters are provided.","content":{"application/json":{"schema":{"oneOf":[{"type":"array","items":{"$ref":"#/components/schemas/SalesItem"},"title":"Legacy Format"},{"title":"Paginated Format","allOf":[{"$ref":"#/components/schemas/PaginatedSalesItemsResponse"}]}]},"examples":{"Legacy Format":{"summary":"Response without page/limit parameters — returns a simple array","value":[{"item_id":"aXRlbToyOTczNjM=","size_id":"","quantity":15,"net_sales":225,"gross_sales":225,"cost":0},{"item_id":"aXRlbToyOTgyMTM=","size_id":"","quantity":8,"net_sales":56,"gross_sales":56,"cost":0}]},"Paginated Format":{"summary":"Response with page/limit parameters — returns object with data array and pagination metadata","value":{"data":[{"item_id":"aXRlbToyOTczNjM=","size_id":"","quantity":15,"net_sales":225,"gross_sales":225,"cost":0},{"item_id":"aXRlbToyOTgyMTM=","size_id":"","quantity":8,"net_sales":56,"gross_sales":56,"cost":0}],"pagination":{"total":2,"page":1,"limit":50,"total_pages":1}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Sales"]}},"/v2/reports/sales/reportCategories/{startDate}/{endDate}":{"get":{"description":"Fetch sales report category totals","operationId":"reports_sales_reportCategories","parameters":[{"in":"path","name":"startDate","description":"YYYY-MM-DD","required":true,"schema":{"type":"string","format":"date"}},{"in":"path","name":"endDate","description":"YYYY-MM-DD","required":true,"schema":{"type":"string","format":"date"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SalesReportCategory"}},"example":[{"report_category_id":"cmVwb3J0Q2F0ZWdvcnk6OTUwMw==","quantity":101,"net_sales":1927.41,"gross_sales":1941.58},{"report_category_id":"cmVwb3J0Q2F0ZWdvcnk6OTUwMg==","quantity":292,"net_sales":2611.49,"gross_sales":2725.8}]}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Sales"]}},"/v2/reports/sales/rooms/{startDate}/{endDate}":{"get":{"description":"Fetch sales room totals","operationId":"reports_sales_rooms","parameters":[{"in":"path","name":"startDate","description":"YYYY-MM-DD","required":true,"schema":{"type":"string","format":"date"}},{"in":"path","name":"endDate","description":"YYYY-MM-DD","required":true,"schema":{"type":"string","format":"date"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SalesRoom"}},"example":[{"room_id":"cm9vbTo1MjE0","quantity":12,"seat_count":4,"guest_count":4,"net_sales":-15.73,"gross_sales":-13.25},{"room_id":"cm9vbTo1MTU1","quantity":1,"seat_count":1,"guest_count":1,"net_sales":6.5,"gross_sales":12.49}]}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Sales"]}},"/v2/reports/sales/sections/{startDate}/{endDate}":{"get":{"description":"Fetch sales section totals","operationId":"reports_sales_sections","parameters":[{"in":"path","name":"startDate","description":"YYYY-MM-DD","required":true,"schema":{"type":"string","format":"date"}},{"in":"path","name":"endDate","description":"YYYY-MM-DD","required":true,"schema":{"type":"string","format":"date"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SalesSection"}},"example":[{"section_id":"c2VjdGlvbjoyNzYxNw==","quantity":3,"net_sales":13.85,"gross_sales":13.85},{"section_id":"c2VjdGlvbjoyNzgxNA==","quantity":-15,"net_sales":-25.98,"gross_sales":-23.5}]}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Sales"]}},"/v2/reports/sales/staff/{startDate}/{endDate}":{"get":{"description":"Fetch sales staff totals for the given date range.\n\n**Special `staff_id` values** (base64-encoded graph IDs of the underlying integer `StaffID`):\n- `c3RhZmY6LTE=` (decodes to `staff:-1`) — Online Order User\n- `c3RhZmY6MA==` (decodes to `staff:0`) — Unassigned","operationId":"reports_sales_staff","parameters":[{"in":"path","name":"startDate","description":"YYYY-MM-DD","required":true,"schema":{"type":"string","format":"date"}},{"in":"path","name":"endDate","description":"YYYY-MM-DD","required":true,"schema":{"type":"string","format":"date"}},{"in":"query","name":"staff_id","description":"Optional staff graph ID (e.g. `c3RhZmY6MTYxMzg1`) to filter results to a single staff member.","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SalesStaff"}},"example":[{"staff_id":"c3RhZmY6MTYxMzg1","staff_name":"Jane Doe","ticket_count":12,"guest_count":8,"net_sales":145.5,"gross_sales":162.75,"total":162.75,"seat_count":20},{"staff_id":"c3RhZmY6MTYxNDAw","staff_name":"John Smith","ticket_count":0,"guest_count":0,"net_sales":0,"gross_sales":0,"total":0,"seat_count":0},{"staff_id":"c3RhZmY6LTE=","staff_name":"Online Order User","ticket_count":3,"guest_count":3,"net_sales":42,"gross_sales":45.5,"total":45.5,"seat_count":0},{"staff_id":"c3RhZmY6MA==","staff_name":"Unassigned","ticket_count":1,"guest_count":1,"net_sales":8,"gross_sales":8,"total":8,"seat_count":1}]}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Sales"]}},"/v2/reports/sales/surcharges/{startDate}/{endDate}":{"get":{"description":"Fetch sales surcharge totals","operationId":"reports_sales_surcharges","parameters":[{"in":"path","name":"startDate","description":"YYYY-MM-DD","required":true,"schema":{"type":"string","format":"date"}},{"in":"path","name":"endDate","description":"YYYY-MM-DD","required":true,"schema":{"type":"string","format":"date"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SalesSurcharge"}},"example":[{"room_id":"cm9vbTo1MjE0","quantity":1,"total":0.03},{"room_id":"cm9vbTo1MTU1","quantity":7,"total":22.5}]}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Sales"]}},"/v2/reports/sales/taxes/{startDate}/{endDate}":{"get":{"description":"Fetch sales tax totals","operationId":"reports_sales_taxes","parameters":[{"in":"path","name":"startDate","description":"YYYY-MM-DD","required":true,"schema":{"type":"string","format":"date"}},{"in":"path","name":"endDate","description":"YYYY-MM-DD","required":true,"schema":{"type":"string","format":"date"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SalesTax"}},"example":[{"tax_id":"dGF4OjE0NjQ=","quantity":7,"total":5.26,"total_inclusive":0.18,"taxable_sales":1000},{"tax_id":"dGF4OjE0NjI=","quantity":9,"total":13.73,"total_inclusive":0.18,"taxable_sales":536.22}]}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Sales"]}},"/v2/reports/sales/taxCategories/{startDate}/{endDate}":{"get":{"description":"Fetch sales tax category totals","operationId":"reports_sales_taxCategories","parameters":[{"in":"path","name":"startDate","description":"YYYY-MM-DD","required":true,"schema":{"type":"string","format":"date"}},{"in":"path","name":"endDate","description":"YYYY-MM-DD","required":true,"schema":{"type":"string","format":"date"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SalesTaxCategory"},"example":{"taxable_items":2051,"tax_inclusive_items":2461.24,"taxable_adjustments":32.5,"taxable_total":4544.74,"tax_exempt_items":242.3}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Sales"]}},"/v2/reports/sales/tipPayouts/{startDate}/{endDate}":{"get":{"description":"Fetch sales tips & payouts totals","operationId":"reports_sales_tipPayouts","parameters":[{"in":"path","name":"startDate","description":"YYYY-MM-DD","required":true,"schema":{"type":"string","format":"date"}},{"in":"path","name":"endDate","description":"YYYY-MM-DD","required":true,"schema":{"type":"string","format":"date"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SalesTipPayout"}},"example":[{"staff_id":"c3RhZmY6MzQ1ODc=","cash":13.6,"payroll":0,"merchant":0,"tip_out":0,"tip_in":0,"total":13.6,"reported":0},{"staff_id":"c3RhZmY6MzQ1ODU=","cash":85.75,"payroll":0,"merchant":0,"tip_out":-10,"tip_in":0,"total":75.75,"reported":0}]}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Sales"]}},"/v2/reports/sales/totals/{startDate}/{endDate}":{"get":{"description":"Fetch sales totals","operationId":"reports_sales_totals","parameters":[{"in":"path","name":"startDate","description":"YYYY-MM-DD","required":true,"schema":{"type":"string","format":"date"}},{"in":"path","name":"endDate","description":"YYYY-MM-DD","required":true,"schema":{"type":"string","format":"date"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SalesTotal"},"example":{"gross_items":4878.54,"non_revenue_items":5,"positive_adjustments":21.5,"gross_sales":4895.04,"auto_discounts":-1.96,"discounts":-3.58,"adjustments":-22.94,"rewards":-100,"net_sales":4766.57,"taxes":168.38,"tax_inclusive":194.64,"surcharges":2.5,"service_charges":0,"tips":145.11,"gross_receipts":5282.19,"taxable_sales":4766.57}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Sales"]}},"/v2/reports/sales/totalsDaily/{startDate}/{endDate}":{"get":{"description":"Fetch sales totals by day","operationId":"reports_sales_totals_daily","parameters":[{"in":"path","name":"startDate","description":"YYYY-MM-DD","required":true,"schema":{"type":"string","format":"date"}},{"in":"path","name":"endDate","description":"YYYY-MM-DD","required":true,"schema":{"type":"string","format":"date"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SalesTotalDaily"}},"example":[{"sales_dt":"2017-04-06","gross_items":4878.54,"non_revenue_items":5,"positive_adjustments":21.5,"gross_sales":4895.04,"auto_discounts":-1.96,"discounts":-3.58,"adjustments":-22.94,"rewards":-100,"net_sales":4766.57,"taxes":168.38,"tax_inclusive":194.64,"surcharges":2.5,"service_charges":0,"tips":145.11,"gross_receipts":5282.19,"taxable_sales":4766.57},{"sales_dt":"2017-04-06","gross_items":2500,"non_revenue_items":0,"positive_adjustments":0,"gross_sales":2500,"auto_discounts":0,"discounts":0,"adjustments":-50,"rewards":0,"net_sales":2450,"taxes":240,"tax_inclusive":0,"surcharges":0,"service_charges":0,"tips":0,"gross_receipts":2690,"taxable_sales":2450}]}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Sales"]}},"/v2/reports/tickets/info/{businessDate}":{"get":{"description":"Fetch list of tickets for a day. Supports optional pagination via query parameters.","operationId":"reports_tickets_list_get","parameters":[{"in":"path","name":"businessDate","description":"YYYY-MM-DD","required":true,"schema":{"type":"string","format":"date"}},{"in":"query","name":"includeOpenTickets","description":"Whether or not to include open tickets","schema":{"type":"string","enum":["yes","no"],"default":"no"}},{"in":"query","name":"staff_id","description":"Filter by assigned staff ID. (Example: c3RhZmY6MzQ1ODU=)","required":false,"schema":{"type":"string"}},{"in":"query","name":"room_id","description":"Filter by room ID. (Example: cm9vbTo1MjE0)","required":false,"schema":{"type":"string"}},{"in":"query","name":"revenue_center_id","description":"Filter by revenue center ID. (Example: cmV2ZW51ZUNlbnRlcjo1MjE0)","required":false,"schema":{"type":"string"}},{"in":"query","name":"status","description":"Filter by ticket status (case-insensitive). (Example: open)","required":false,"schema":{"type":"string","enum":["open","closed","cancelled","combined"]}},{"in":"query","name":"paid_status","description":"Filter by payment status (case-insensitive). (Example: paid_in_full)","required":false,"schema":{"type":"string","enum":["paid_in_full","unpaid","partial_payment","not_refunded","partial_refund","refunded_in_full"]}},{"in":"query","name":"page","description":"Page number (starts from 1). When provided with limit, returns paginated response.","required":false,"schema":{"type":"integer","minimum":1}},{"in":"query","name":"limit","description":"Number of items per page. When provided with page, returns paginated response.","required":false,"schema":{"type":"integer","minimum":1}}],"responses":{"200":{"description":"OK. This endpoint supports two response formats depending on whether pagination query parameters are provided.","content":{"application/json":{"schema":{"oneOf":[{"type":"array","items":{"$ref":"#/components/schemas/Ticket"},"title":"Legacy Format"},{"title":"Paginated Format","allOf":[{"$ref":"#/components/schemas/PaginatedTicketInfoResponse"}]}]},"examples":{"Legacy Format":{"summary":"Response without page/limit parameters — returns a simple array","value":[{"id":"dGlja2V0OjFDRjNENzRBLTg1MjUtNDVERi04RkRFLTI1NTFGRUNEQkJERQ==","opened_dt":"2017-04-06T10:43:53-00:00","closed_dt":"2017-04-10T15:56:21-00:00","promise_dt":"2017-04-07T15:40:00-06:00","staff_id":"c3RhZmY6MzQ1ODU=","void_staff_id":"c3RhZmY6MzQ1ODU=","void_reason":"void_reason","void_reason_description":"void_reason_description","job_type_id":"","created_by_staff_id":"c3RhZmY6MzQ1ODU=","daypart_id":"ZGF5cGFydDo2NzM","room_id":"cm9vbTo1MjE0","revenue_center_id":"cmV2ZW51ZTo1MjE0","guest_count":1,"seat_count":1,"status":"closed","paid_status":"paid_in_full","ticket_number":"V17","phone":null,"guest_name":null,"guest_vehicle":{"make":"","model":"","color":""},"business_name":null,"email":null,"alternate_id":null,"subtotal":0.02,"total":0.23,"net_sales":0.02,"gross_sales":2.5,"tax_exempt":false},{"id":"dGlja2V0OjM5MEFGQURDLUY2RTEtNEJBOC1CN0JGLUExRUQ1NTc0NzM3Rg==","opened_dt":"2017-04-07T14:39:16-00:00","closed_dt":"2017-04-10T15:23:11-00:00","promise_dt":"2017-04-07T15:40:00-06:00","staff_id":"c3RhZmY6MzQ1ODU=","void_staff_id":"c3RhZmY6MzQ1ODU=","void_reason":"void_reason","void_reason_description":"void_reason_description","job_type_id":"","created_by_staff_id":"c3RhZmY6MzQ1ODU=","daypart_id":"ZGF5cGFydDo2NzM","room_id":"cm9vbTo1MjE0","revenue_center_id":"cmV2ZW51ZTo1MjE0","guest_count":1,"seat_count":1,"status":"cancelled","paid_status":"unpaid","ticket_number":"L9","phone":null,"guest_name":null,"guest_vehicle":{"make":"","model":"","color":""},"business_name":null,"email":null,"alternate_id":null,"subtotal":13.45,"total":14.52,"net_sales":13.45,"gross_sales":13.45,"tax_exempt":false}]},"Paginated Format":{"summary":"Response with page/limit parameters — returns object with data array and pagination metadata","value":{"data":[{"id":"dGlja2V0OjFDRjNENzRBLTg1MjUtNDVERi04RkRFLTI1NTFGRUNEQkJERQ==","opened_dt":"2017-04-06T10:43:53-00:00","closed_dt":"2017-04-10T15:56:21-00:00","promise_dt":"2017-04-07T15:40:00-06:00","staff_id":"c3RhZmY6MzQ1ODU=","void_staff_id":"c3RhZmY6MzQ1ODU=","void_reason":"void_reason","void_reason_description":"void_reason_description","job_type_id":"","created_by_staff_id":"c3RhZmY6MzQ1ODU=","daypart_id":"ZGF5cGFydDo2NzM","room_id":"cm9vbTo1MjE0","revenue_center_id":"cmV2ZW51ZTo1MjE0","guest_count":1,"seat_count":1,"status":"closed","paid_status":"paid_in_full","ticket_number":"V17","phone":null,"guest_name":null,"guest_vehicle":{"make":"","model":"","color":""},"business_name":null,"email":null,"alternate_id":null,"subtotal":0.02,"total":0.23,"net_sales":0.02,"gross_sales":2.5,"tax_exempt":false}],"pagination":{"total":150,"page":1,"limit":50,"total_pages":3}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Tickets"]},"post":{"description":"Search list of tickets for a day. Supports optional pagination via query parameters.","operationId":"reports_tickets_list_post","parameters":[{"in":"path","name":"businessDate","description":"YYYY-MM-DD","required":true,"schema":{"type":"string","format":"date"}},{"in":"query","name":"page","description":"Page number (starts from 1). When provided with limit, returns paginated response.","required":false,"schema":{"type":"integer","minimum":1}},{"in":"query","name":"limit","description":"Number of items per page. When provided with page, returns paginated response.","required":false,"schema":{"type":"integer","minimum":1}}],"requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"type":"object","properties":{"phone":{"type":"string"},"email":{"type":"string"},"alternate_id":{"type":"string"}}}}}},"responses":{"200":{"description":"OK. This endpoint supports two response formats depending on whether pagination query parameters are provided.","content":{"application/json":{"schema":{"oneOf":[{"type":"array","items":{"$ref":"#/components/schemas/Ticket"},"title":"Legacy Format"},{"title":"Paginated Format","allOf":[{"$ref":"#/components/schemas/PaginatedTicketInfoResponse"}]}]},"examples":{"Legacy Format":{"summary":"Response without page/limit parameters — returns a simple array","value":[{"id":"dGlja2V0OjFDRjNENzRBLTg1MjUtNDVERi04RkRFLTI1NTFGRUNEQkJERQ==","opened_dt":"2017-04-06T10:43:53-00:00","closed_dt":"2017-04-10T15:56:21-00:00","staff_id":"c3RhZmY6MzQ1ODU=","job_type_id":"","created_by_staff_id":"c3RhZmY6MzQ1ODU=","room_id":"cm9vbTo1MjE0","revenue_center_id":"cmV2ZW51ZTo1MjE0","guest_count":1,"seat_count":1,"status":"closed","paid_status":"paid_in_full","ticket_number":"V17","phone":null,"guest_name":null,"guest_vehicle":{"make":"","model":"","color":""},"business_name":null,"email":null,"alternate_id":null,"subtotal":0.02,"total":0.23,"net_sales":0.02,"gross_sales":2.5,"tax_exempt":false},{"id":"dGlja2V0OjM5MEFGQURDLUY2RTEtNEJBOC1CN0JGLUExRUQ1NTc0NzM3Rg==","opened_dt":"2017-04-07T14:39:16-00:00","closed_dt":"2017-04-10T15:23:11-00:00","staff_id":"c3RhZmY6MzQ1ODU=","job_type_id":"","created_by_staff_id":"c3RhZmY6MzQ1ODU=","room_id":"cm9vbTo1MjE0","revenue_center_id":"cmV2ZW51ZTo1MjE0","guest_count":1,"seat_count":1,"status":"cancelled","paid_status":"unpaid","ticket_number":"L9","phone":null,"guest_name":null,"guest_vehicle":{"make":"","model":"","color":""},"business_name":null,"email":null,"alternate_id":null,"subtotal":13.45,"total":14.52,"net_sales":13.45,"gross_sales":13.45,"tax_exempt":false}]},"Paginated Format":{"summary":"Response with page/limit parameters — returns object with data array and pagination metadata","value":{"data":[{"id":"dGlja2V0OjFDRjNENzRBLTg1MjUtNDVERi04RkRFLTI1NTFGRUNEQkJERQ==","opened_dt":"2017-04-06T10:43:53-00:00","closed_dt":"2017-04-10T15:56:21-00:00","staff_id":"c3RhZmY6MzQ1ODU=","job_type_id":"","created_by_staff_id":"c3RhZmY6MzQ1ODU=","room_id":"cm9vbTo1MjE0","revenue_center_id":"cmV2ZW51ZTo1MjE0","guest_count":1,"seat_count":1,"status":"closed","paid_status":"paid_in_full","ticket_number":"V17","phone":null,"guest_name":null,"guest_vehicle":{"make":"","model":"","color":""},"business_name":null,"email":null,"alternate_id":null,"subtotal":0.02,"total":0.23,"net_sales":0.02,"gross_sales":2.5,"tax_exempt":false}],"pagination":{"total":150,"page":1,"limit":50,"total_pages":3}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Tickets"]}},"/v2/reports/tickets/items/{businessDate}":{"get":{"description":"Fetch list of ticket items for a day. Supports optional pagination via query parameters.","operationId":"reports_ticket_items_list","parameters":[{"in":"path","name":"businessDate","description":"YYYY-MM-DD","required":true,"schema":{"type":"string","format":"date"}},{"in":"query","name":"staff_id","description":"Filter by the staff member who added the item. (Example: c3RhZmY6MzQ1ODU=)","required":false,"schema":{"type":"string"}},{"in":"query","name":"item_id","description":"Filter by menu item ID. (Example: aXRlbToxMjM0NQ==)","required":false,"schema":{"type":"string"}},{"in":"query","name":"section_id","description":"Filter by menu section ID. (Example: c2VjdGlvbjo2Nzg=)","required":false,"schema":{"type":"string"}},{"in":"query","name":"group_id","description":"Filter by menu group ID. (Example: Z3JvdXA6OTA=)","required":false,"schema":{"type":"string"}},{"in":"query","name":"ticket_status","description":"Filter by ticket status (case-insensitive). (Example: open)","required":false,"schema":{"type":"string","enum":["open","closed","cancelled","combined"]}},{"in":"query","name":"ticket_paid_status","description":"Filter by ticket payment status (case-insensitive). (Example: paid_in_full)","required":false,"schema":{"type":"string","enum":["paid_in_full","unpaid","partial_payment","not_refunded","partial_refund","refunded_in_full"]}},{"in":"query","name":"page","description":"Page number (starts from 1). When provided with limit, returns paginated response.","required":false,"schema":{"type":"integer","minimum":1}},{"in":"query","name":"limit","description":"Number of items per page. When provided with page, returns paginated response.","required":false,"schema":{"type":"integer","minimum":1}}],"responses":{"200":{"description":"OK. This endpoint supports two response formats depending on whether pagination query parameters are provided.","content":{"application/json":{"schema":{"oneOf":[{"type":"array","items":{"$ref":"#/components/schemas/TicketItem"},"title":"Legacy Format"},{"title":"Paginated Format","allOf":[{"$ref":"#/components/schemas/PaginatedTicketItemsResponse"}]}]},"examples":{"Legacy Format":{"summary":"Response without page/limit parameters — returns a simple array","value":[{"id":"dF9JdGVtOjU0MUM0MTcwLTk5ODQtNDIxQi1CNDdFLUE3Rjg5NTdCMzczMQ==","ticket_id":"dGlja2V0OkVDRUE1NjlELUFDQ0QtNEEwMi1CNkU2LTVBNEU0NTM4NjUxMQ==","ticket_status":"closed","ticket_paid_status":"paid_in_full","ticket_number":"B5","added_dt":"2018-07-02T18:41:04+00:00","voided_dt":"","course":0,"seat":1,"item_id":"aXRlbToyOTU5NjE=","size_id":"c2l6ZToxMTQyMg==","section_id":"c2VjdGlvbjoyNzYxNA==","group_id":"Z3JvdXA6NTc1NQ==","discount_id":"","discount_price":0,"discount_staff_id":"","discount_reason_description":"","auto_discount_price":0,"sub_item":false,"parent_id":"","quantity":1,"measured_amount":0,"measurement_type":"not_measured","cost":3.5,"subtotal":9,"total":9,"net_sales":9,"gross_sales":9,"staff_id":"","void_staff_id":"","void_reason":"","void_reason_description":"","open_item_name":"","special_instructions":""},{"id":"dF9JdGVtOjU5OTkyOTNELTU4QjYtNEE2RS05NjVCLTRDNUNBQTJFMTJCRg==","ticket_id":"dGlja2V0OkEyRERCQTU2LUFGNTItNDhGQS05NDdELUI4MTk3NDQ5MEI2MA==","ticket_status":"closed","ticket_paid_status":"paid_in_full","ticket_number":"B4","added_dt":"2018-07-02T18:29:33+00:00","voided_dt":"2018-07-02T18:29:33+00:00","course":0,"seat":1,"item_id":"aXRlbToyOTcxMzY=","size_id":"c2l6ZToxMTQyMg==","section_id":"c2VjdGlvbjoyNzYxMw==","group_id":"Z3JvdXA6NTc1NQ==","discount_id":"","discount_price":0,"discount_staff_id":"c3RhZmY6NTc4NjM5","discount_reason_description":"test","auto_discount_price":0,"sub_item":false,"parent_id":"","quantity":1,"measured_amount":0,"measurement_type":"not_measured","cost":3.75,"subtotal":9.5,"total":9.5,"net_sales":9.5,"gross_sales":9.5,"staff_id":"c3RhZmY6MTE5MDk2NQ==","void_staff_id":"c3RhZmY6MTE5MDk2NQ==","void_reason":"void reason","void_reason_description":"void_reason_description","open_item_name":"","special_instructions":""}]},"Paginated Format":{"summary":"Response with page/limit parameters — returns object with data array and pagination metadata","value":{"data":[{"id":"dF9JdGVtOjU0MUM0MTcwLTk5ODQtNDIxQi1CNDdFLUE3Rjg5NTdCMzczMQ==","ticket_id":"dGlja2V0OkVDRUE1NjlELUFDQ0QtNEEwMi1CNkU2LTVBNEU0NTM4NjUxMQ==","ticket_status":"closed","ticket_paid_status":"paid_in_full","ticket_number":"B5","added_dt":"2018-07-02T18:41:04+00:00","voided_dt":"","course":0,"seat":1,"item_id":"aXRlbToyOTU5NjE=","size_id":"c2l6ZToxMTQyMg==","section_id":"c2VjdGlvbjoyNzYxNA==","group_id":"Z3JvdXA6NTc1NQ==","discount_id":"","discount_price":0,"discount_staff_id":"","discount_reason_description":"","auto_discount_price":0,"sub_item":false,"parent_id":"","quantity":1,"measured_amount":0,"measurement_type":"not_measured","cost":3.5,"subtotal":9,"total":9,"net_sales":9,"gross_sales":9,"staff_id":"","void_staff_id":"","void_reason":"","void_reason_description":"","open_item_name":"","special_instructions":""}],"pagination":{"total":150,"page":1,"limit":20,"total_pages":8}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Tickets"]}},"/v2/reports/tickets/ingredients/{businessDate}":{"get":{"description":"Fetch list of ticket ingredients for a day. Supports optional pagination via query parameters.","operationId":"reports_ticket_ingredients_list","parameters":[{"in":"path","name":"businessDate","description":"YYYY-MM-DD","required":true,"schema":{"type":"string","format":"date"}},{"in":"query","name":"page","description":"Page number (starts from 1). When provided with limit, returns paginated response.","required":false,"schema":{"type":"integer","minimum":1}},{"in":"query","name":"limit","description":"Number of items per page. When provided with page, returns paginated response.","required":false,"schema":{"type":"integer","minimum":1}}],"responses":{"200":{"description":"OK. This endpoint supports two response formats depending on whether pagination query parameters are provided.","content":{"application/json":{"schema":{"oneOf":[{"type":"array","items":{"$ref":"#/components/schemas/TicketIngredient"},"title":"Legacy Format"},{"title":"Paginated Format","allOf":[{"$ref":"#/components/schemas/PaginatedTicketIngredientsResponse"}]}]},"examples":{"Legacy Format":{"summary":"Response without page/limit parameters — returns a simple array","value":[{"id":"dF9JdGVtOjIyMTlFRDUyLTkwQkMtNDFCMy05NDQ5LUZBQ0Q4MjBEM0U5Nw==","ticket_id":"dGlja2V0OkYyQTI3MTE0LUNBREItNEI1MS04RUM4LTRENzVGMDU4QTU4Nw==","ticket_status":"closed","ticket_paid_status":"paid_in_full","ticket_number":"N1","added_dt":"2018-07-17T15:56:04+00:00","voided_dt":"","ticket_item_id":"dF9JdGVtOjkwOUFDNDhDLUMzNjQtNDMxOC05MjJBLTI0RkEzMzY1RjQ5QQ==","item_id":"aXRlbToyMzUyODQ=","size_id":"c2l6ZTo5MjIw","section_id":"c2VjdGlvbjo5Mzc1","group_id":"Z3JvdXA6MTczMw==","modifier_id":"bW9kaWZpZXI6MzM1OTE=","ingredient_id":"aW5ncmVkaWVudDoxNDUyODA=","default_on":false,"price":0,"enabled":true,"open_ingredient_name":"","special_instructions":""},{"id":"dF9JdGVtOjI1RUQ4M0EyLTZENzgtNDdFRC1BMUVFLTUzMTUwNkQ4RTBDMg==","ticket_id":"dGlja2V0OjEyMEVENkNBLUVDNUEtNENFOC05MENFLTkwMkI1RUQ1QTIxMQ==","ticket_status":"closed","ticket_paid_status":"paid_in_full","ticket_number":"S1","added_dt":"2018-07-17T15:59:37+00:00","voided_dt":"","ticket_item_id":"dF9JdGVtOkIwMThEOUIyLUIxQzAtNEEwMi1BOEVELUQ1ODNCOTE1RUZDMw==","item_id":"aXRlbToyMzUyODQ=","size_id":"c2l6ZTo5MjIw","section_id":"c2VjdGlvbjo5Mzc1","group_id":"Z3JvdXA6MTczMw==","modifier_id":"bW9kaWZpZXI6MzM1OTE=","ingredient_id":"aW5ncmVkaWVudDoxNDUyNzk=","default_on":false,"price":0.25,"enabled":true,"open_ingredient_name":"","special_instructions":""}]},"Paginated Format":{"summary":"Response with page/limit parameters — returns object with data array and pagination metadata","value":{"data":[{"id":"dF9JdGVtOjIyMTlFRDUyLTkwQkMtNDFCMy05NDQ5LUZBQ0Q4MjBEM0U5Nw==","ticket_id":"dGlja2V0OkYyQTI3MTE0LUNBREItNEI1MS04RUM4LTRENzVGMDU4QTU4Nw==","ticket_status":"closed","ticket_paid_status":"paid_in_full","ticket_number":"N1","added_dt":"2018-07-17T15:56:04+00:00","voided_dt":"","ticket_item_id":"dF9JdGVtOjkwOUFDNDhDLUMzNjQtNDMxOC05MjJBLTI0RkEzMzY1RjQ5QQ==","item_id":"aXRlbToyMzUyODQ=","size_id":"c2l6ZTo5MjIw","section_id":"c2VjdGlvbjo5Mzc1","group_id":"Z3JvdXA6MTczMw==","modifier_id":"bW9kaWZpZXI6MzM1OTE=","ingredient_id":"aW5ncmVkaWVudDoxNDUyODA=","default_on":false,"price":0,"enabled":true,"open_ingredient_name":"","special_instructions":""}],"pagination":{"total":150,"page":1,"limit":20,"total_pages":8}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Tickets"]}},"/v2/reports/tickets/adjustments/{businessDate}":{"get":{"description":"Fetch list of ticket adjustments for a day. Supports optional pagination via query parameters.","operationId":"reports_ticket_adjustments_list","parameters":[{"in":"path","name":"businessDate","description":"YYYY-MM-DD","required":true,"schema":{"type":"string","format":"date"}},{"in":"query","name":"staff_id","description":"Filter by the staff member who applied the adjustment. Base64-encoded graph ID. (Example: c3RhZmY6MzQ1ODU=)","required":false,"schema":{"type":"string"}},{"in":"query","name":"adjustment_id","description":"Filter by menu adjustment ID (e.g., scope to all \"Manager Comp\" applications). Base64-encoded graph ID. (Example: YWRqdXN0bWVudDo4MTcx)","required":false,"schema":{"type":"string"}},{"in":"query","name":"ticket_status","description":"Filter by ticket status (case-insensitive). (Example: open)","required":false,"schema":{"type":"string","enum":["open","closed","cancelled","combined"]}},{"in":"query","name":"ticket_paid_status","description":"Filter by ticket payment status (case-insensitive). (Example: paid_in_full)","required":false,"schema":{"type":"string","enum":["paid_in_full","unpaid","partial_payment","not_refunded","partial_refund","refunded_in_full"]}},{"in":"query","name":"page","description":"Page number (starts from 1). When provided with limit, returns paginated response.","required":false,"schema":{"type":"integer","minimum":1}},{"in":"query","name":"limit","description":"Number of items per page. When provided with page, returns paginated response.","required":false,"schema":{"type":"integer","minimum":1}}],"responses":{"200":{"description":"OK. This endpoint supports two response formats depending on whether pagination query parameters are provided.","content":{"application/json":{"schema":{"oneOf":[{"type":"array","items":{"$ref":"#/components/schemas/TicketAdjustment"},"title":"Legacy Format"},{"title":"Paginated Format","allOf":[{"$ref":"#/components/schemas/PaginatedTicketAdjustmentsResponse"}]}]},"examples":{"Legacy Format":{"summary":"Response without page/limit parameters — returns a simple array","value":[{"id":"dF9BZGp1c3RtZW50OjMxMUM4NUFELTZGMEUtNDNCNy1CNDkxLTJENzc3MEZFMkFEOA==","ticket_id":"dGlja2V0Oh7vv70GazxbT+60hO+/vTJzGe+/ve+/vQ==","ticket_status":"closed","ticket_paid_status":"paid_in_full","ticket_number":"Z1","added_dt":"2018-07-10T22:09:37+00:00","voided_dt":"","adjustment_id":"YWRqdXN0bWVudDo4MTcx","adjustment_description":"adjustment_description","non_revenue":false,"tax_exempt":false,"service_charge":false,"total":2,"staff_id":"c3RhZmY6MTE5MDk2NQ==","void_staff_id":"c3RhZmY6MTE5MDk2NQ=="},{"id":"dF9BZGp1c3RtZW50OjY4NUE5NjU4LTU1QTQtNDMxNy1BOTBDLTA1NUY4RUQ0QTc5QQ==","ticket_id":"dGlja2V0Ou+/vW0lEe+/ve+/vUd677+9AxTvv73vv70Aehk=","ticket_status":"closed","ticket_paid_status":"paid_in_full","ticket_number":"X3","added_dt":"2018-07-10T20:04:06+00:00","voided_dt":"","adjustment_id":"YWRqdXN0bWVudDo1NDAy","adjustment_description":"","non_revenue":false,"tax_exempt":false,"service_charge":false,"total":-1,"staff_id":"","void_staff_id":""}]},"Paginated Format":{"summary":"Response with page/limit parameters — returns object with data array and pagination metadata","value":{"data":[{"id":"dF9BZGp1c3RtZW50OjMxMUM4NUFELTZGMEUtNDNCNy1CNDkxLTJENzc3MEZFMkFEOA==","ticket_id":"dGlja2V0Oh7vv70GazxbT+60hO+/vTJzGe+/ve+/vQ==","ticket_status":"closed","ticket_paid_status":"paid_in_full","ticket_number":"Z1","added_dt":"2018-07-10T22:09:37+00:00","voided_dt":"","adjustment_id":"YWRqdXN0bWVudDo4MTcx","adjustment_description":"adjustment_description","non_revenue":false,"tax_exempt":false,"service_charge":false,"total":2,"staff_id":"c3RhZmY6MTE5MDk2NQ==","void_staff_id":"c3RhZmY6MTE5MDk2NQ=="}],"pagination":{"total":142,"page":1,"limit":50,"total_pages":3}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Tickets"]}},"/v2/reports/tickets/taxes/{businessDate}":{"get":{"description":"Fetch list of ticket taxes for a day. Supports optional pagination via query parameters.","operationId":"reports_ticket_taxes_list","parameters":[{"in":"path","name":"businessDate","description":"YYYY-MM-DD","required":true,"schema":{"type":"string","format":"date"}},{"in":"query","name":"page","description":"Page number (starts from 1). When provided with limit, returns paginated response.","required":false,"schema":{"type":"integer","minimum":1}},{"in":"query","name":"limit","description":"Number of items per page. When provided with page, returns paginated response.","required":false,"schema":{"type":"integer","minimum":1}}],"responses":{"200":{"description":"OK. This endpoint supports two response formats depending on whether pagination query parameters are provided.","content":{"application/json":{"schema":{"oneOf":[{"type":"array","items":{"$ref":"#/components/schemas/TicketTax"},"title":"Legacy Format"},{"title":"Paginated Format","allOf":[{"$ref":"#/components/schemas/PaginatedTicketTaxesResponse"}]}]},"examples":{"Legacy Format":{"summary":"Response without page/limit parameters — returns a simple array","value":[{"id":"dF9UYXg6MDBFQkVDRTQtRTNGNi1BOTg4LTdGNTgtMEI3NDgyODk1QTYz","ticket_id":"dGlja2V0OkYyQTI3MTE0LUNBREItNEI1MS04RUM4LTRENzVGMDU4QTU4Nw==","ticket_status":"closed","ticket_paid_status":"paid_in_full","ticket_number":"N1","tax_id":"dGF4OjIzNjc=","total":2.52,"total_inclusive":0,"taxable_sales":25.22},{"id":"dF9UYXg6MEFCRkE5MjktQjdCQi0wQTZCLUMzRjctNzhCRTg3RDkzMzc1","ticket_id":"dGlja2V0OjczRDlCNDU5LTMzRjUtNDhFNy1CQzc0LUZDQzhDNzI2QUY3RQ==","ticket_status":"closed","ticket_paid_status":"paid_in_full","ticket_number":"S5","tax_id":"dGF4OjIzNjg=","total":0.48,"total_inclusive":0,"taxable_sales":4.88}]},"Paginated Format":{"summary":"Response with page/limit parameters — returns object with data array and pagination metadata","value":{"data":[{"id":"dF9UYXg6MDBFQkVDRTQtRTNGNi1BOTg4LTdGNTgtMEI3NDgyODk1QTYz","ticket_id":"dGlja2V0OkYyQTI3MTE0LUNBREItNEI1MS04RUM4LTRENzVGMDU4QTU4Nw==","ticket_status":"closed","ticket_paid_status":"paid_in_full","ticket_number":"N1","tax_id":"dGF4OjIzNjc=","total":2.52,"total_inclusive":0,"taxable_sales":25.22}],"pagination":{"total":150,"page":1,"limit":20,"total_pages":8}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Tickets"]}},"/v2/reports/tickets/surcharges/{businessDate}":{"get":{"description":"Fetch list of ticket surcharges for a day. Supports optional pagination via query parameters.","operationId":"reports_ticket_surcharges_list","parameters":[{"in":"path","name":"businessDate","description":"YYYY-MM-DD","required":true,"schema":{"type":"string","format":"date"}},{"in":"query","name":"page","description":"Page number (starts from 1). When provided with limit, returns paginated response.","required":false,"schema":{"type":"integer","minimum":1}},{"in":"query","name":"limit","description":"Number of items per page. When provided with page, returns paginated response.","required":false,"schema":{"type":"integer","minimum":1}}],"responses":{"200":{"description":"OK. This endpoint supports two response formats depending on whether pagination query parameters are provided.","content":{"application/json":{"schema":{"oneOf":[{"type":"array","items":{"$ref":"#/components/schemas/TicketSurcharge"},"title":"Legacy Format"},{"title":"Paginated Format","allOf":[{"$ref":"#/components/schemas/PaginatedTicketSurchargesResponse"}]}]},"examples":{"Legacy Format":{"summary":"Response without page/limit parameters — returns a simple array","value":[{"id":"dF9TdXJjaGFyZ2U6NDYwRkUwQkUtRERBNi0yNDVGLTRBNzUtQjcxODg0QjYxNjg0","ticket_id":"dGlja2V0OjM5MkI4Qjc5LTU3NkItNEZDNS04REQwLTNENTAzMzUyNDk5Rg==","ticket_status":"closed","ticket_paid_status":"paid_in_full","ticket_number":"A13","room_id":"cm9vbToxODcy","total":1},{"id":"dF9TdXJjaGFyZ2U6NUQyRjc3MUQtN0U2MS1CRURGLTk5QUYtNEREQ0Y5NEJFOTdD","ticket_id":"dGlja2V0OjFBMzM1N0FELTBDRDctNDQ0OS1CQjU1LUM2QTgzRDdFMEU3Qg==","ticket_status":"closed","ticket_paid_status":"paid_in_full","ticket_number":"A10","room_id":"cm9vbToxODcy","total":1}]},"Paginated Format":{"summary":"Response with page/limit parameters — returns object with data array and pagination metadata","value":{"data":[{"id":"dF9TdXJjaGFyZ2U6NDYwRkUwQkUtRERBNi0yNDVGLTRBNzUtQjcxODg0QjYxNjg0","ticket_id":"dGlja2V0OjM5MkI4Qjc5LTU3NkItNEZDNS04REQwLTNENTAzMzUyNDk5Rg==","ticket_status":"closed","ticket_paid_status":"paid_in_full","ticket_number":"A13","room_id":"cm9vbToxODcy","total":1}],"pagination":{"total":150,"page":1,"limit":20,"total_pages":8}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Tickets"]}},"/v2/reports/tickets/transactions/{businessDate}":{"get":{"description":"Fetch list of ticket transactions for a day","operationId":"reports_ticket_transactions_list","parameters":[{"in":"path","name":"businessDate","description":"YYYY-MM-DD","required":true,"schema":{"type":"string","format":"date"}},{"in":"query","name":"page","description":"Page number (starts from 1). When provided with limit, returns paginated response.","required":false,"schema":{"type":"integer","minimum":1}},{"in":"query","name":"limit","description":"Number of items per page. When provided with page, returns paginated response.","required":false,"schema":{"type":"integer","minimum":1}},{"in":"query","name":"staff_id","description":"Filter by the staff member who performed the transaction. Value must be a base64-encoded GraphQL ID (e.g. c3RhZmY6MTIzNA==).","required":false,"schema":{"type":"string"}},{"in":"query","name":"type","description":"Filter by transaction type. Case-insensitive.","required":false,"schema":{"type":"string","enum":["cash","credit_card","house_account","gift_card","debit_card"]}},{"in":"query","name":"status","description":"Filter by transaction status. Case-insensitive.","required":false,"schema":{"type":"string","enum":["sale","auth","capture","adjust","void"]}},{"in":"query","name":"ticket_status","description":"Filter by ticket status. Case-insensitive.","required":false,"schema":{"type":"string","enum":["open","closed","cancelled","combined"]}},{"in":"query","name":"ticket_paid_status","description":"Filter by ticket payment status. Case-insensitive.","required":false,"schema":{"type":"string","enum":["paid_in_full","unpaid","not_refunded","partial_refund","refunded_in_full","partial_payment"]}}],"responses":{"200":{"description":"OK. This endpoint supports two response formats depending on whether pagination query parameters are provided.","content":{"application/json":{"schema":{"oneOf":[{"type":"array","items":{"$ref":"#/components/schemas/TicketTransaction"},"title":"Legacy Format"},{"title":"Paginated Format","allOf":[{"$ref":"#/components/schemas/PaginatedTicketTransactionsResponse"}]}]},"examples":{"Legacy Format":{"summary":"Response without page/limit parameters — returns a simple array","value":[{"id":"dF9UcmFuc2FjdGlvbjoxMjg3OUJEQS1BNTU5LTQ0OUUtQTBCRC00RjM1MDMxQkUxNjg=","ticket_id":"dGlja2V0Ou+/ve+/vXEU77+977+9S1Hvv73vv71Nde+/vVjvv73vv70=","ticket_status":"closed","ticket_paid_status":"paid_in_full","ticket_number":"N1","added_dt":"2018-07-11T19:53:16+00:00","voided_dt":"","staff_id":"c3RhZmY6ODEzOA==","void_staff_id":"c3RhZmY6MzQ1ODU=","void_reason":"void_reason","void_reason_description":"void_reason_description","type":"house_account","status":"sale","card_type":"","card_num":null,"card_name":null,"house_account_id":"aG91c2VBY2NvdW50OjMwMjcx","ref":"","amount":21.8,"tip":0,"total":21.8,"additional_info":{"reference":null}},{"id":"dF9UcmFuc2FjdGlvbjoxODcxOEU1RC1FNkEzLTQ3MkEtQUU4RC05NjRBOTlDQjdCMDc=","ticket_id":"dGlja2V0Ou+/ve+/vXEU77+977+9S1Hvv73vv71Nde+/vVjvv73vv70=","ticket_status":"closed","ticket_paid_status":"paid_in_full","ticket_number":"N1","added_dt":"2018-07-17T15:56:20+00:00","voided_dt":"","staff_id":"c3RhZmY6ODEzOA==","void_staff_id":"c3RhZmY6MzQ1ODU=","void_reason":"void_reason","void_reason_description":"void_reason_description","type":"house_account","status":"sale","card_type":"","card_num":null,"card_name":null,"house_account_id":"aG91c2VBY2NvdW50OjMwMjcx","ref":"","amount":17.44,"tip":0,"total":17.44,"additional_info":{"reference":null}}]},"Paginated Format":{"summary":"Response with page/limit parameters — returns object with data array and pagination metadata","value":{"data":[{"id":"dF9UcmFuc2FjdGlvbjoxMjg3OUJEQS1BNTU5LTQ0OUUtQTBCRC00RjM1MDMxQkUxNjg=","ticket_id":"dGlja2V0Ou+/ve+/vXEU77+977+9S1Hvv73vv71Nde+/vVjvv73vv70=","ticket_status":"closed","ticket_paid_status":"paid_in_full","ticket_number":"N1","added_dt":"2018-07-11T19:53:16+00:00","voided_dt":"","staff_id":"c3RhZmY6ODEzOA==","void_staff_id":"c3RhZmY6MzQ1ODU=","void_reason":"void_reason","void_reason_description":"void_reason_description","type":"house_account","status":"sale","card_type":"","card_num":null,"card_name":null,"house_account_id":"aG91c2VBY2NvdW50OjMwMjcx","ref":"","amount":21.8,"tip":0,"total":21.8,"additional_info":{"reference":null}}],"pagination":{"total":142,"page":1,"limit":50,"total_pages":3}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Tickets"]}},"/v2/reports/cash/drawers/{businessDate}":{"get":{"description":"Fetch list of cash drawers for a day","operationId":"reports_cash_drawers_list","parameters":[{"in":"path","name":"businessDate","description":"YYYY-MM-DD","required":true,"schema":{"type":"string","format":"date"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CashDrawer"}},"example":[{"id":"Y2FzaERyYXdlcjpFNDQ0QjVEQy0wNjNELTQzNDgtODM2Ny0wQTgwRDUyRDU1MkU=","opened_dt":"2017-07-11T19:57:07+00:00","closed_dt":"2017-07-11T23:05:47+00:00","drawer_name":"MB iPad Pro 3","staff_id":"c3RhZmY6ODEzOA==","virtual":false,"no_sale":1,"starting_amount":100,"actual_cash":0,"pay_in":0,"pay_out":0,"server_balance":0,"expected_cash":171.55,"no_sale_events":[{"occurred_at":"2017-07-11T20:15:32+00:00","staff_id":"c3RhZmY6ODEzOA==","staff_name":"John Smith"}]},{"id":"Y2FzaERyYXdlcjo3NUY2NkNDMS01RDQyLTRBREYtOEUwQS05MEQ2OUJFN0I1RjU=","opened_dt":"2017-07-11T19:58:49+00:00","closed_dt":"2017-07-11T19:58:50+00:00","drawer_name":"MB iPad Pro 3","staff_id":"c3RhZmY6ODE0MQ==","virtual":true,"no_sale":0,"starting_amount":0,"actual_cash":0,"pay_in":0,"pay_out":0,"server_balance":0.6,"expected_cash":0,"no_sale_events":[]}]}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Cash"]}},"/v2/reports/cash/paidInOuts/{businessDate}":{"get":{"description":"Fetch list of cash paid in/out for a day","operationId":"reports_cash_paidInOut_list","parameters":[{"in":"path","name":"businessDate","description":"YYYY-MM-DD","required":true,"schema":{"type":"string","format":"date"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CashDrawerPaidInOut"}},"example":[{"id":"Y19QYXlJbk91dDo1NjkyRTdEMS0wMTFCLTQzRkQtQkUzQi01MUU1NDMzMkI1RTE=","drawer_id":"Y2FzaERyYXdlcjoyNjJFMUYyMS1BRUQwLTQ4RDktODVBRS0zQTZCOTFBOTlEQzk=","added_dt":"2018-04-14T20:38:26+00:00","daypart_id":"ZGF5cGFydDo2NzM","staff_id":"c3RhZmY6ODEzOA==","paid_in_out_id":"cGFpZEluT3V0VHlwZToyMjY3","amount":-20},{"id":"Y19QYXlJbk91dDo2MzA4NjdDRi03RTA5LTQ2NjAtODNFRS1ENTNDQkNFNDg2MTM=","drawer_id":"Y2FzaERyYXdlcjoyNjJFMUYyMS1BRUQwLTQ4RDktODVBRS0zQTZCOTFBOTlEQzk=","added_dt":"2018-04-14T22:21:36+00:00","daypart_id":"ZGF5cGFydDo2NzM","staff_id":"c3RhZmY6ODEzOA==","paid_in_out_id":"cGFpZEluT3V0VHlwZToyMjY3","amount":-8}]}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Cash"]}},"/v2/reports/labor/punches/{startDate}/{endDate}":{"get":{"description":"Fetch list of time punches","operationId":"reports_labor_punches","parameters":[{"in":"path","name":"startDate","description":"YYYY-MM-DD","required":true,"schema":{"type":"string","format":"date"}},{"in":"path","name":"endDate","description":"YYYY-MM-DD","required":true,"schema":{"type":"string","format":"date"}},{"in":"query","name":"includeOpenPunches","description":"Whether or not to include open punches","schema":{"type":"string","enum":["yes","no"],"default":"no"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/LaborPunch"}},"example":[{"id":"dGltZXB1bmNoOkQ4OEYyRERELTk5MEItNDQxRC1CQ0E2LTQ1NDgyQjQwQUFBNQ==","staff_id":"c3RhZmY6MzQ1ODY=","job_type_id":"am9iVHlwZTo3MTUw","punch_in_dt":"2017-01-14T11:00:00-00:00","punch_out_dt":"2017-01-14T14:42:00-00:00","regular_rate":9.8,"regular_hours":3.7,"regular_pay":36.26,"overtime_rate":14.7,"overtime_hours":0,"overtime_pay":0,"doubletime_hours":0,"doubletime_pay":0,"total_hours":3.7,"total_pay":36.26,"est_system_tips":20,"reported_tips":30,"breaks":[{"id":"cHVuY2hfQnJlYWs6MkQwNDI3RDYtQ0U5OC00QTI4LUJBQjctQUM1Q0JDQzcyQjQw","break_id":"YnJlYWtUeXBlOjI=","break_start_dt":"2017-01-14T13:00:00-00:00","break_end_dt":"2017-01-14T13:15:00-00:00","paid":false}]},{"id":"dGltZXB1bmNoOjMxMzk0RDdDLUQxNDAtNDVEQS04NERGLTkyNDhENDIyOEE3RQ==","staff_id":"c3RhZmY6MzQ1ODU=","job_type_id":"am9iVHlwZTo3MTUx","punch_in_dt":"2017-01-14T12:00:00-00:00","punch_out_dt":"2017-01-14T22:00:00-00:00","regular_rate":14,"regular_hours":8,"regular_pay":112,"overtime_rate":21,"overtime_hours":2,"overtime_pay":42,"doubletime_hours":0,"doubletime_pay":0,"total_hours":10,"total_pay":154,"est_system_tips":0,"reported_tips":0,"breaks":[{"id":"cHVuY2hfQnJlYWs6NzkxRTdFQ0UtQzc0Qi00M0NCLUEyRkEtMzU5Njg2Nzg3MDMx","break_id":"YnJlYWtUeXBlOjI=","break_start_dt":"2017-01-14T17:00:00-00:00","break_end_dt":"2017-01-14T17:15:00-00:00","paid":false}]}]}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Labor"]}},"/v2/setup/breakTypes":{"get":{"description":"Fetch list of break types","operationId":"setup_breakTypes","parameters":[{"in":"query","name":"showDeleted","description":"Include deleted items","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":[{"id":"YnJlYWtUeXBlOjE=","name":"Paid Lunch","paid":true},{"id":"YnJlYWtUeXBlOjI=","name":"Unpaid 15 Minute Break","paid":false}]}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Setup"]}},"/v2/setup/dayparts":{"get":{"description":"Fetch list of dayparts","operationId":"setup_dayparts","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SetupDaypart"}},"example":[{"id":"ZGF5cGFydDo2NzM=","name":"Breakfast","sunday":[{"start_hour":0,"end_hour":11}],"monday":[{"start_hour":0,"end_hour":11}],"tuesday":[{"start_hour":0,"end_hour":11}],"wednesday":[{"start_hour":0,"end_hour":11}],"thursday":[{"start_hour":0,"end_hour":11}],"friday":[{"start_hour":0,"end_hour":11}],"saturday":[{"start_hour":0,"end_hour":11}]},{"id":"ZGF5cGFydDo2NzU=","name":"Dinner","sunday":[{"start_hour":16,"end_hour":24}],"monday":[{"start_hour":16,"end_hour":24}],"tuesday":[{"start_hour":16,"end_hour":24}],"wednesday":[{"start_hour":16,"end_hour":24}],"thursday":[{"start_hour":16,"end_hour":24}],"friday":[{"start_hour":16,"end_hour":24}],"saturday":[{"start_hour":16,"end_hour":24}]},{"id":"ZGF5cGFydDo2NzQ=","name":"Lunch","sunday":[{"start_hour":11,"end_hour":16}],"monday":[{"start_hour":11,"end_hour":16}],"tuesday":[{"start_hour":11,"end_hour":16}],"wednesday":[{"start_hour":11,"end_hour":16}],"thursday":[{"start_hour":11,"end_hour":16}],"friday":[{"start_hour":11,"end_hour":16}],"saturday":[{"start_hour":11,"end_hour":16}]}]}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Setup"]}},"/v2/setup/displayFormats":{"get":{"description":"Fetch list of display formats","operationId":"setup_displayFormats","parameters":[{"in":"query","name":"showDeleted","description":"Include deleted items","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SetupDisplayFormat"}},"example":[{"id":"ZGlzcGxheUZvcm1hdDozNDU1","name":"Cold Sandwich Line"},{"id":"ZGlzcGxheUZvcm1hdDozNDU0","name":"Expo"}]}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Setup"]}},"/v2/setup/houseAccounts":{"get":{"description":"Fetch list of house accounts","operationId":"setup_houseAccounts","parameters":[{"in":"query","name":"showDeleted","description":"When true, soft-deleted house accounts are also included in the list. Whenever this parameter is provided (either true or false), every returned item includes the `deleted` boolean; when the parameter is omitted, deleted rows are excluded and the `deleted` field is not returned.","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SetupHouseAccount"}},"example":[{"id":"aG91c2VBY2NvdW50OjI1MjM5","name":"Check","pos_tender_visibility":true,"is_active":true,"is_house_account":false,"account_holder_name":"","account_holder_phone":"","account_holder_email":"","access_code":"","code_required":false,"manage_balance":false,"credit_limit":0,"allow_tips":false,"server_cash_split":0,"server_payroll_split":0,"merchant_split":0,"allow_signature":false,"open_drawer":false,"require_reference":false,"transaction_receipts":"0","notes":""},{"id":"aG91c2VBY2NvdW50OjI1MTM1","name":"Customer Tab","pos_tender_visibility":false,"is_active":true,"is_house_account":true,"account_holder_name":"Jane Smith","account_holder_phone":"555-0100","account_holder_email":"jane@example.com","access_code":"1234","code_required":true,"manage_balance":true,"credit_limit":500,"allow_tips":true,"server_cash_split":30,"server_payroll_split":20,"merchant_split":50,"allow_signature":true,"open_drawer":false,"require_reference":true,"transaction_receipts":"2","notes":"VIP customer tab"}]}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Setup"]},"post":{"description":"Create a custom tender (house account).","operationId":"setup_createHouseAccount","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetupHouseAccountCreate"},"example":{"name":"Employee House Account","is_active":true,"pos_tender_visibility":false,"is_house_account":true,"account_holder_name":"Jane Smith","account_holder_phone":"555-867-5309","account_holder_email":"jane.smith@example.com","access_code":"ACC-00123","code_required":true,"manage_balance":true,"credit_limit":500,"allow_tips":true,"server_cash_split":60,"server_payroll_split":30,"merchant_split":10,"allow_signature":true,"open_drawer":false,"require_reference":false,"transaction_receipts":"1","notes":"Used for employee meal benefits."}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetupHouseAccountDetail"},"example":{"id":"aG91c2VBY2NvdW50OjI1MjQw","name":"Employee House Account","is_active":true,"pos_tender_visibility":false,"is_house_account":true,"account_holder_name":"Jane Smith","account_holder_phone":"555-867-5309","account_holder_email":"jane.smith@example.com","access_code":"ACC-00123","code_required":true,"manage_balance":true,"credit_limit":500,"allow_tips":true,"server_cash_split":60,"server_payroll_split":30,"merchant_split":10,"allow_signature":true,"open_drawer":false,"require_reference":false,"transaction_receipts":"1","notes":"Used for employee meal benefits."}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"412":{"$ref":"#/components/responses/PreconditionFailed"}},"tags":["Setup"]}},"/v2/setup/houseAccounts/{id}":{"put":{"description":"Fully replace a custom tender (house account). This is a full-replace update.","parameters":[{"in":"path","name":"id","description":"House account id (the opaque graph id returned by GET/POST, e.g. `aG91c2VBY2NvdW50OjI1MjQw`).","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetupHouseAccountPut"},"example":{"name":"Employee House Account","is_active":true,"pos_tender_visibility":false,"is_house_account":true,"account_holder_name":"Jane Smith","account_holder_phone":"555-867-5309","account_holder_email":"jane.smith@example.com","access_code":"ACC-00123","code_required":true,"manage_balance":true,"credit_limit":750,"allow_tips":true,"server_cash_split":60,"server_payroll_split":30,"merchant_split":10,"allow_signature":true,"open_drawer":false,"require_reference":false,"transaction_receipts":"1","notes":"Updated employee meal benefit tender."}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetupHouseAccountDetail"},"example":{"id":"aG91c2VBY2NvdW50OjI1MjQw","name":"Employee House Account","is_active":true,"pos_tender_visibility":false,"is_house_account":true,"account_holder_name":"Jane Smith","account_holder_phone":"555-867-5309","account_holder_email":"jane.smith@example.com","access_code":"ACC-00123","code_required":true,"manage_balance":true,"credit_limit":750,"allow_tips":true,"server_cash_split":60,"server_payroll_split":30,"merchant_split":10,"allow_signature":true,"open_drawer":false,"require_reference":false,"transaction_receipts":"1","notes":"Updated employee meal benefit tender."}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"description":"Not Found. The id is well-formed but no active house account matches it. Example message: `No house account found for id aG91c2VBY2NvdW50Ojk5OTk5.`."},"412":{"$ref":"#/components/responses/PreconditionFailed"}},"tags":["Setup"]},"patch":{"description":"Partially update a custom tender (house account). All fields are optional.","operationId":"setup_patchHouseAccount","parameters":[{"in":"path","name":"id","description":"House account id (the opaque graph id returned by GET/POST, e.g. `aG91c2VBY2NvdW50OjI1MjQw`).","required":true,"schema":{"type":"string"}}],"requestBody":{"description":"House account fields to update. All fields are optional.","required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetupHouseAccountPatch"},"example":{"name":"Employee House Account","is_active":true,"pos_tender_visibility":false,"is_house_account":true,"account_holder_name":"Jane Smith","account_holder_phone":"555-867-5309","account_holder_email":"jane.smith@example.com","access_code":"ACC-00123","code_required":true,"manage_balance":true,"credit_limit":750,"allow_tips":true,"server_cash_split":60,"server_payroll_split":30,"merchant_split":10,"allow_signature":true,"open_drawer":false,"require_reference":false,"transaction_receipts":"1","notes":"Updated employee meal benefit tender."}}}},"responses":{"200":{"description":"House account updated. Returns an empty body."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"description":"Not Found. The id is well-formed but no active house account matches it. Example message: `No house account found for id aG91c2VBY2NvdW50Ojk5OTk5.`."},"412":{"$ref":"#/components/responses/PreconditionFailed"}},"tags":["Setup"]}},"/v2/setup/jobTypes":{"get":{"description":"Fetch list of job types","operationId":"setup_jobTypes","parameters":[{"in":"query","name":"showDeleted","description":"Include deleted items","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SetupJobType"}},"example":[{"id":"am9iVHlwZTo3MTUx","name":"Manager","labor_category_id":"bGFib3JDYXRlZ29yeTo0ODg=","time_clock_only":false,"require_tips":false,"hide_ticket_status":false,"save_no_connection":true,"ticket_access":"edit","cash_transactions_mode":"cash_drawer","server_checkout_report":"prompt","tender_cash":"any_drawer","void_cash":"any_drawer","pay_in_out":"any_drawer","no_sale":"any_drawer","server_balance":"any_drawer","ignore_formats":[],"assigned_staff":[]},{"id":"am9iVHlwZTo3MTUw","name":"Server","labor_category_id":"bGFib3JDYXRlZ29yeTo0ODc=","time_clock_only":false,"require_tips":true,"hide_ticket_status":false,"save_no_connection":false,"ticket_access":"view_only","cash_transactions_mode":"server_banking","server_checkout_report":"always","tender_cash":"bank_only","void_cash":"bank_only","pay_in_out":"bank_only","no_sale":"none","server_balance":"bank_only","ignore_formats":[{"id":"ZGlzcGxheUZvcm1hdDoxMjM="}],"assigned_staff":[{"staff_id":"c3RhZmY6MTY5Mjcx","regular_rate":15,"overtime_rate":22.5}]}]}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Setup"]},"post":{"description":"Create a job type","operationId":"setup_createJobType","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetupJobTypeCreate"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetupJobTypeDetail"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Setup"]}},"/v2/setup/jobTypes/{id}":{"put":{"description":"Fully replace an existing job type. All provided fields overwrite the current values; omitted optional fields, `ignore_formats`, and `assigned_staff` are reset to their defaults/empty.","operationId":"setup_replaceJobType","parameters":[{"in":"path","name":"id","description":"Base64-encoded job type ID. Format: `jobType:<numeric_id>`","required":true,"schema":{"type":"string"}}],"requestBody":{"description":"Full job type representation.","required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetupJobTypeCreate"},"examples":{"full_replacement":{"summary":"Replace all job type fields","value":{"name":"Lead Server","labor_category_id":"bGFib3JDYXRlZ29yeTo0ODc=","time_clock_only":false,"require_tips":true,"hide_ticket_status":false,"save_no_connection":false,"ticket_access":"edit","cash_transactions_mode":"server_banking","server_checkout_report":"prompt","tender_cash":"bank_only","void_cash":"bank_only","pay_in_out":"bank_only","no_sale":"none","server_balance":"bank_only","ignore_formats":[{"id":"ZGlzcGxheUZvcm1hdDoxMjM="}],"assigned_staff":[{"staff_id":"c3RhZmY6MTY5Mjcx","regular_rate":16.5,"overtime_rate":24.75}]}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetupJobTypeDetail"},"example":{"id":"am9iVHlwZTo3MTUx","name":"Lead Server","labor_category_id":"bGFib3JDYXRlZ29yeTo0ODc=","time_clock_only":false,"require_tips":true,"hide_ticket_status":false,"save_no_connection":false,"ticket_access":"edit","cash_transactions_mode":"server_banking","server_checkout_report":"prompt","tender_cash":"bank_only","void_cash":"bank_only","pay_in_out":"bank_only","no_sale":"none","server_balance":"bank_only","ignore_formats":[{"id":"ZGlzcGxheUZvcm1hdDoxMjM="}],"assigned_staff":[{"staff_id":"c3RhZmY6MTY5Mjcx","regular_rate":16.5,"overtime_rate":24.75}]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"description":"Not Found. Example message: `jobType not found: jobType:<id>`."}},"tags":["Setup"]},"patch":{"description":"Partially update an existing job type. All fields are optional; omitted fields remain unchanged. When `ignore_formats` or `assigned_staff` are included, they replace the full existing set for that field.","operationId":"setup_updateJobType","parameters":[{"in":"path","name":"id","description":"Base64-encoded job type ID. Format: `jobType:<numeric_id>`","required":true,"schema":{"type":"string"}}],"requestBody":{"description":"Job type fields to update. All fields are optional.","required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetupJobTypePatch"},"examples":{"name_only":{"summary":"Rename the job type","value":{"name":"Lead Server"}},"switch_cash_mode":{"summary":"Switch cash handling to server banking","value":{"cash_transactions_mode":"server_banking","tender_cash":"bank_only","server_balance":"bank_only"}},"replace_assigned_staff":{"summary":"Replace the full assigned staff set","value":{"assigned_staff":[{"staff_id":"c3RhZmY6MTY5Mjcx","regular_rate":16.5,"overtime_rate":24.75}]}}}}}},"responses":{"200":{"description":"Job type updated. Returns an empty body."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"description":"Not Found. Example message: `jobType not found: jobType:<id>`."}},"tags":["Setup"]}},"/v2/setup/laborCategories":{"get":{"description":"Fetch list of labor categories","operationId":"setup_laborCategories","parameters":[{"in":"query","name":"showDeleted","description":"Include deleted items","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SetupLaborCategory"}},"example":[{"id":"bGFib3JDYXRlZ29yeTo0ODg=","name":"BOH","fixed_cost":15.5,"assigned_job_types":[{"job_type_id":"am9iVHlwZTo3MTUx"}]},{"id":"bGFib3JDYXRlZ29yeTo0ODc=","name":"FOH","fixed_cost":0,"assigned_job_types":[]}]}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Setup"]},"post":{"description":"Create a new labor category","operationId":"setup_createLaborCategory","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetupLaborCategoryCreate"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetupLaborCategoryDetail"},"example":{"id":"bGFib3JDYXRlZ29yeTo0ODg=","name":"BOH","fixed_cost":0,"assigned_job_types":[{"job_type_id":"am9iVHlwZTo3MTUx"}]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Setup"]}},"/v2/setup/laborCategories/{id}":{"put":{"description":"Fully replace an existing labor category. All updatable fields must be supplied; omitted optional fields fall back to their documented defaults.","operationId":"setup_replaceLaborCategory","parameters":[{"in":"path","name":"id","description":"Base64-encoded GraphID (key: laborCategory)","required":true,"schema":{"type":"string"}}],"requestBody":{"description":"Full labor category representation.","required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetupLaborCategoryCreate"},"examples":{"full_replacement":{"summary":"Replace all labor category fields","value":{"name":"BOH","fixed_cost":15.5,"assigned_job_types":[{"job_type_id":"am9iVHlwZTo3MTUx"}]}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetupLaborCategoryDetail"},"example":{"id":"bGFib3JDYXRlZ29yeTo0ODg=","name":"BOH","fixed_cost":15.5,"assigned_job_types":[{"job_type_id":"am9iVHlwZTo3MTUx"}]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"description":"Not Found. Example message: `laborCategory not found: laborCategory:<id>`."}},"tags":["Setup"]},"patch":{"description":"Partially update an existing labor category. Only provided fields will be updated.","operationId":"setup_patchLaborCategory","parameters":[{"in":"path","name":"id","description":"Base64-encoded GraphID (key: laborCategory)","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetupLaborCategoryPatch"}}}},"responses":{"200":{"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"description":"Labor category not found"}},"tags":["Setup"]}},"/v2/setup/paidInOutTypes":{"get":{"description":"Fetch list of paid in/out types","operationId":"setup_paidInOutTypes","parameters":[{"in":"query","name":"showDeleted","description":"Include deleted items","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SetupPaidInOutType"}},"example":[{"id":"cGFpZEluT3V0VHlwZToyMjY2","name":"Grocery Run"},{"id":"cGFpZEluT3V0VHlwZToyMjY3","name":"Misc."}]}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Setup"]},"post":{"description":"Create a new paid in/out type. The request body must contain only a non-empty name field.","operationId":"setup_createPaidInOutTypes","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetupPaidInOutTypeCreate"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetupPaidInOutType"},"example":{"id":"cGFpZEluT3V0VHlwZToyMjY2","name":"Grocery Run"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Setup"]}},"/v2/setup/paidInOutTypes/{id}":{"patch":{"description":"Partially update an existing paid in/out type. Only provided fields will be updated.","operationId":"setup_patchPaidInOutTypes","parameters":[{"in":"path","name":"id","description":"Base64-encoded GraphID (key: paidInOutType)","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetupPaidInOutTypePatch"},"example":{"name":"Bank Deposit"}}}},"responses":{"200":{"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"description":"Not Found. Example message: `paidInOutType not found: paidInOutType:<id>`."}},"tags":["Setup"]}},"/v2/setup/printers":{"get":{"description":"Fetch list of printers","operationId":"setup_printers","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SetupPrinter"}},"example":[{"id":"cHJpbnRlcjozNzg5","name":"Bar","ip_address":"10.0.0.100","shared":false,"split_drawers":false,"buzzer":false,"brand":"star","series":"thermal"},{"id":"cHJpbnRlcjozNzkw","name":"Kitchen","ip_address":"10.0.0.101","shared":false,"split_drawers":false,"buzzer":false,"brand":"epson","series":"tm_u220"}]}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Setup"]}},"/v2/setup/rooms":{"get":{"description":"Fetch list of rooms","operationId":"setup_rooms","parameters":[{"in":"query","name":"showDeleted","description":"Include deleted items","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SetupRoom"}},"example":[{"id":"cm9vbTo1MjE0","name":"Bar","type":"tab","revenue_center_id":"cmV2ZW51ZUNlbnRlcjo5OTIwMQ==","surcharge_amount":0,"surcharge_amount_type":"dollar","tables":[],"taxes":[{"id":"dGF4OjE0NzYy","name":"brandtax","rate":10,"override":false,"tags":[{"id":"dGFnOjc1MDU3","name":"brand-tag"},{"id":"dGFnOjc1MTM3","name":"michael-tag"}]}],"pricing_rules":[{"id":"cHJpY2luZ19ydWxlOjExODc5","name":"brand-p-normal","short_identifier":"asd","apply_post_tax":true,"start_date":"2025-06-01","end_date":"2025-06-30","available_online":false,"schedule":[{"day":"Sunday","start_time":"01:00","end_time":"19:59"},{"day":"Monday","start_time":"02:00","end_time":"23:59"},{"day":"Tuesday","start_time":"03:00","end_time":"23:59"},{"day":"Wednesday","start_time":"04:00","end_time":"23:59"},{"day":"Thursday","start_time":"05:00","end_time":"23:59"},{"day":"Friday","start_time":"06:00","end_time":"23:59"},{"day":"Saturday","start_time":"07:00","end_time":"23:59"}],"pricing":[{"target_type":"tag/attribute","target_id":"dGFnOjc1ODM5","target_name":"a-1","adjustment_type":"force_price","amount":1,"affects_modifiers":false,"size":null},{"target_type":"tag/attribute","target_id":"dGFnOjc1ODM4","target_name":"tag-1","adjustment_type":"dollar-adjust","amount":2,"affects_modifiers":false,"size":null},{"target_type":"group","target_id":"Z3JvdXA6OTIwOTU=","target_name":"GroupName668","adjustment_type":"percent_adjust","amount":3,"affects_modifiers":false,"size":null},{"target_type":"section","target_id":"c2VjdGlvbjoyMDI4Nzc=","target_name":"HR-57920-Section01","adjustment_type":"force_price","amount":4,"affects_modifiers":true,"size":null},{"target_type":"item","target_id":"aXRlbToxMDc3NjE0NQ==","target_name":"123","adjustment_type":"dollar-adjust","amount":5.3,"affects_modifiers":false,"size":{"id":"c2l6ZToxMDc3ODU3NA==","name":"size123"}},{"target_type":"size","target_id":"c2l6ZToxMDc3ODU3NA==","target_name":"<a>Item<a/>","adjustment_type":"percent_adjust","amount":6.1,"affects_modifiers":true,"size":null}]}],"discounts":[],"adjustments":[]},{"id":"cm9vbTo1MTU1","name":"Patio","type":"table_layout","revenue_center_id":null,"surcharge_amount":0,"surcharge_amount_type":"dollar","tables":[{"table_id":"dGFibGU6NTM0","table_name":"Front Table"}],"taxes":[],"pricing_rules":[],"discounts":[{"id":"ZGlzY291bnQ6NTY5MzM=","name":"discount-1"},{"id":"ZGlzY291bnQ6NTczNDk=","name":"discount-2"}],"adjustments":[{"id":"YWRqdXN0bWVudDo1MDM3Mw==","name":"adjust-room-spe-1"},{"id":"YWRqdXN0bWVudDo1NzMxOQ==","name":"adjust-room-spe-2"}]}]}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Setup"]}},"/v2/setup/settings":{"get":{"description":"Fetch location settings","operationId":"setup_settings","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetupSettings"},"example":{"parent_account_number":"5501806992","parent_account_name":"Cafe MB Account","account_number":"5501806682","reseller":"Reseller Name","name":"Cafe MB","address":"555 W Beech St, Ste 222","city":"San Diego","state":"CA","zip":"92101","timezone":"America/Phoenix","phone":"4803518800","end_of_day":"00:00:00"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Setup"]},"post":{"description":"Update location settings","operationId":"setup_settings_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSetupSettings"}}},"required":true},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetupSettings"},"example":{"parent_account_number":"5501806992","parent_account_name":"Cafe MB Account","account_number":"5501806682","name":"Cafe MB","address":"555 W Beech St, Ste 222","city":"San Diego","state":"CA","zip":"92101","timezone":"America/Phoenix","phone":"4803518800","end_of_day":"00:00:00"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Setup"]}},"/v2/setup/scheduledShifts/list/{businessDate}":{"get":{"description":"Fetch list of scheduled shifts for a business date","operationId":"setup_scheduledShifts_list","parameters":[{"in":"path","name":"businessDate","description":"YYYY-MM-DD","required":true,"schema":{"type":"string","format":"date"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SetupScheduledShift"}},"example":[{"id":"c2hpZnQ6NjM=","staff_id":"c3RhZmY6MzQ1ODk=","job_type_id":"am9iVHlwZTo3MTg4","business_date":"2018-08-15","start_dt":"2018-08-15 12:00:00","end_dt":"2018-08-15 22:30:00"},{"id":"c2hpZnQ6NjQ=","staff_id":"c3RhZmY6MzQ1ODg=","job_type_id":"am9iVHlwZTo3MTUy","business_date":"2018-08-15","start_dt":"2018-08-15 14:00:00","end_dt":"2018-08-15 22:00:00"}]}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Setup"]}},"/v2/setup/scheduledShifts":{"post":{"description":"Create a new scheduled shift","operationId":"setup_scheduledShifts_put","requestBody":{"$ref":"#/components/requestBodies/SetupScheduledShiftCreate"},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetupScheduledShift"},"example":{"id":"c2hpZnQ6NjM=","staff_id":"c3RhZmY6MzQ1ODk=","job_type_id":"am9iVHlwZTo3MTg4","business_date":"2018-08-15","start_dt":"2018-08-15 12:00:00","end_dt":"2018-08-15 22:30:00"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"409":{"description":"Schedule shift already exists. A shift with the same staff_id, job_type_id, business_date, start_dt, and end_dt already exists for this location."}},"tags":["Setup"]}},"/v2/setup/scheduledShifts/{id}":{"put":{"description":"Update an existing scheduled shift","operationId":"setup_scheduledShifts_post","parameters":[{"in":"path","name":"id","description":"","required":true,"schema":{"type":"string"}}],"requestBody":{"$ref":"#/components/requestBodies/SetupScheduledShift"},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetupScheduledShift"},"example":{"id":"c2hpZnQ6NjM=","staff_id":"c3RhZmY6MzQ1ODk=","job_type_id":"am9iVHlwZTo3MTg4","business_date":"2018-08-15","start_dt":"2018-08-15 12:00:00","end_dt":"2018-08-15 22:30:00"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Setup"]},"delete":{"description":"Delete an existing scheduled shift","operationId":"setup_scheduledShifts_delete","parameters":[{"in":"path","name":"id","description":"","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteResponseType"},"example":{"success":true}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Setup"]}},"/v2/setup/staff":{"get":{"description":"Fetch list of staff","operationId":"setup_staff_get","parameters":[{"in":"query","name":"showDeleted","description":"Include deleted items","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SetupStaffGet"}},"example":[{"id":"c3RhZmY6MzQ1ODU=","first_name":"Manager","last_name":"","employee_id":"","user_pin":"1234","daily_overtime_limit":8,"phone":"","salary":false,"active":true,"language":"","role_id":"","report_access_id":"cmVwb3J0QWNjZXNzOjExOTY3","jobTypes":[{"job_type_id":"am9iVHlwZTo3MTUx","regular_rate":20,"overtime_rate":30}]},{"id":"c3RhZmY6MzQ1ODY=","first_name":"Server","last_name":"","employee_id":"","user_pin":"5678","daily_overtime_limit":8,"phone":"","salary":false,"active":true,"language":"en-US","role_id":"cGVybWlzc2lvbnM6OTU4NA==","report_access_id":"","jobTypes":[{"job_type_id":"am9iVHlwZTo3MTUw","regular_rate":8,"overtime_rate":10}]}]}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Setup"]},"post":{"description":"Create new staff","operationId":"setup_staff_post","requestBody":{"$ref":"#/components/requestBodies/SetupStaffCreate"},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetupStaff"},"example":{"id":"c3RhZmY6MTY5Mjc4","first_name":"Bob","last_name":"Barker","employee_id":"1337","user_pin":"8888","daily_overtime_limit":8,"phone":"12345678","salary":true,"active":true,"language":"en-US","role_id":"cGVybWlzc2lvbnM6OTU4NA==","report_access_id":"","jobTypes":[{"job_type_id":"am9iVHlwZTozNzg3OA==","regular_rate":40,"overtime_rate":60}],"created_when":"2026-09-10T12:34:56.000Z"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Setup"]}},"/v2/setup/staff/{id}":{"put":{"description":"Update an existing staff member by ID. Returns the updated staff member with an updated_when timestamp.","operationId":"setup_staff_put_id","parameters":[{"in":"path","name":"id","description":"","required":true,"schema":{"type":"string"}}],"requestBody":{"$ref":"#/components/requestBodies/SetupStaffUpdate"},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetupStaffPutResponse"},"example":{"id":"c3RhZmY6MTY5Mjcx","first_name":"Johnny","last_name":"Cash","employee_id":"1337","user_pin":"1447","daily_overtime_limit":8,"phone":"123-456-78","salary":false,"active":true,"language":"en-US","role_id":"cGVybWlzc2lvbnM6OTU4NA==","report_access_id":"","jobTypes":[{"job_type_id":"am9iVHlwZTozODAyOA==","regular_rate":55,"overtime_rate":88},{"job_type_id":"am9iVHlwZTozNzg3OA==","regular_rate":77,"overtime_rate":222}],"updated_when":"2026-09-14T12:00:00.000Z"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Setup"]},"patch":{"description":"Partially update an existing staff. Only provided fields will be updated.","operationId":"setup_staff_patch_id","parameters":[{"in":"path","name":"id","description":"","required":true,"schema":{"type":"string"}}],"requestBody":{"$ref":"#/components/requestBodies/SetupStaffUpdate"},"responses":{"200":{"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Setup"]},"delete":{"description":"Delete an existing staff","operationId":"setup_staff_delete_id","parameters":[{"in":"path","name":"id","description":"Base64-encoded staff graph ID (e.g. `c3RhZmY6MTY5Mjcx`)","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteResponseType"},"example":{"success":true}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Setup"]}},"/v2/setup/tablets":{"get":{"description":"Fetch list of authorized tablets","operationId":"setup_tablets","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SetupTablet"}},"example":[{"id":"dGFibGV0OkE1NDBBQUMxLTg4NkItNEM1MS05N0YzLUFGNUUyOTk0QjRBMw==","name":"iPad Pro 1"},{"id":"dGFibGV0OjY0RkQ1MUVELTUyRjktNDA2OS05QzBBLTgyNUNCRkE5NjBDNA==","name":"iPad Air 2"}]}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Setup"]}},"/v2/setup/permissions":{"get":{"description":"Fetch list of permissions","operationId":"setup_permissions","parameters":[{"in":"query","name":"showDeleted","description":"Include deleted items","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SetupPermissionsGet"}},"example":[{"id":"c3RhZmY6MzQ1ODU=","name":"Admin","super_user":true,"order_void":false,"order_discount":false,"order_bill_house_account":false,"order_item_delete":false,"manager_reports":false,"manager_assign_cash_drawer":false,"manager_close_cash_drawer":false,"manager_time_punch":false,"manager_devices":false,"manager_printers":false,"manager_screen_saver":false,"manager_daily_close":false,"closed_sections":false,"order_void_transaction":false,"move_item":false,"reprint":false,"change_server":false,"change_table":false,"show_expected_cash":false,"stock_item":false,"online_order":false,"manager_comp":false,"pay_in_outs":false,"no_sale":false,"offline_mode":false,"force_send":false,"refund":false,"assign_pin":false,"apply_rewards":false,"reprint_kitchen":false,"training_mode":false,"no_tax":false,"misc_item":false,"manage_tip_pools":false,"manual_tip_outs":false,"unscheduled_clock_in":false,"split_check":false,"transfer_credit_card":false,"can_discard_changes":false,"enter_continuity_mode":false,"logout_pos":true,"large_tip_approval":true,"pause_third_party_ordering":true,"assigned_discounts":[{"discount_id":"ZGlzY291bnQ6MTAw"}],"assigned_adjustments":[{"adjustment_id":"YWRqdXN0bWVudDoyMDA="}],"assigned_staff":[{"staff_id":"c3RhZmY6MzAw"}]},{"id":"c3RhZmY6MzQ1ODY=","name":"Manager","super_user":false,"order_void":true,"order_discount":false,"order_bill_house_account":false,"order_item_delete":false,"manager_reports":false,"manager_assign_cash_drawer":false,"manager_close_cash_drawer":false,"manager_time_punch":false,"manager_devices":false,"manager_printers":false,"manager_screen_saver":false,"manager_daily_close":false,"closed_sections":false,"order_void_transaction":true,"move_item":true,"reprint":true,"change_server":true,"change_table":true,"show_expected_cash":true,"stock_item":true,"online_order":true,"manager_comp":true,"pay_in_outs":true,"no_sale":true,"offline_mode":false,"force_send":false,"refund":false,"assign_pin":false,"apply_rewards":false,"reprint_kitchen":false,"training_mode":false,"no_tax":false,"misc_item":false,"manage_tip_pools":false,"manual_tip_outs":false,"unscheduled_clock_in":false,"split_check":false,"transfer_credit_card":true,"can_discard_changes":false,"enter_continuity_mode":false,"logout_pos":false,"large_tip_approval":false,"pause_third_party_ordering":false,"assigned_discounts":[{"discount_id":"ZGlzY291bnQ6MTAw"}],"assigned_adjustments":[{"adjustment_id":"YWRqdXN0bWVudDoyMDA="}],"assigned_staff":[{"staff_id":"c3RhZmY6MzAw"}]}]}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Setup"]},"post":{"description":"Create a new permission","operationId":"setup_permissions_post","requestBody":{"$ref":"#/components/requestBodies/SetupPermissionsCreate"},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetupPermissions"},"example":{"id":"cGVybWlzc2lvbnM6OTU4NA==","name":"Shift Lead","super_user":false,"order_void":true,"order_discount":false,"order_bill_house_account":false,"order_item_delete":true,"manager_reports":false,"manager_assign_cash_drawer":false,"manager_close_cash_drawer":false,"manager_time_punch":false,"manager_devices":false,"manager_printers":false,"manager_screen_saver":false,"manager_daily_close":false,"closed_sections":false,"order_void_transaction":false,"move_item":true,"reprint":true,"change_server":true,"change_table":true,"show_expected_cash":false,"stock_item":false,"online_order":false,"manager_comp":false,"pay_in_outs":false,"no_sale":false,"offline_mode":false,"force_send":false,"refund":false,"assign_pin":false,"apply_rewards":false,"reprint_kitchen":false,"training_mode":false,"no_tax":false,"misc_item":false,"manage_tip_pools":false,"manual_tip_outs":false,"unscheduled_clock_in":false,"split_check":true,"transfer_credit_card":false,"can_discard_changes":false,"enter_continuity_mode":false,"logout_pos":false,"large_tip_approval":false,"pause_third_party_ordering":false,"assigned_discounts":[{"discount_id":"ZGlzY291bnQ6MTIzNA=="}],"assigned_adjustments":[{"adjustment_id":"YWRqdXN0bWVudDo1Njc4"}],"assigned_staff":[{"staff_id":"c3RhZmY6MTY5Mjc4"}]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"}},"tags":["Setup"]}},"/v2/setup/permissions/{id}":{"put":{"description":"Fully replaces a permission role. Any field not provided is reset (flags to `false`, arrays cleared).","operationId":"setup_permissions_put_id","parameters":[{"in":"path","name":"id","description":"Unique ID of the permission role to replace","required":true,"schema":{"type":"string"}}],"requestBody":{"$ref":"#/components/requestBodies/SetupPermissionsUpdate"},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetupPermissions"},"example":{"id":"cGVybWlzc2lvbnM6OTU4NA==","name":"Shift Lead","super_user":false,"order_void":true,"order_discount":false,"order_bill_house_account":false,"order_item_delete":true,"manager_reports":false,"manager_assign_cash_drawer":false,"manager_close_cash_drawer":false,"manager_time_punch":false,"manager_devices":false,"manager_printers":false,"manager_screen_saver":false,"manager_daily_close":false,"closed_sections":false,"order_void_transaction":false,"move_item":true,"reprint":true,"change_server":true,"change_table":true,"show_expected_cash":false,"stock_item":false,"online_order":false,"manager_comp":false,"pay_in_outs":false,"no_sale":false,"offline_mode":false,"force_send":false,"refund":false,"assign_pin":false,"apply_rewards":false,"reprint_kitchen":false,"training_mode":false,"no_tax":false,"misc_item":false,"manage_tip_pools":false,"manual_tip_outs":false,"unscheduled_clock_in":false,"split_check":true,"transfer_credit_card":false,"can_discard_changes":false,"enter_continuity_mode":false,"logout_pos":true,"large_tip_approval":false,"pause_third_party_ordering":false,"assigned_discounts":[{"discount_id":"ZGlzY291bnQ6MTIzNA=="}],"assigned_adjustments":[{"adjustment_id":"YWRqdXN0bWVudDo1Njc4"}],"assigned_staff":[{"staff_id":"c3RhZmY6MTY5Mjc4"}]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"}},"tags":["Setup"]},"patch":{"description":"Partially updates a permission role. Only fields included in the request body are changed.","operationId":"setup_permissions_patch_id","parameters":[{"in":"path","name":"id","description":"Unique ID of the permission role to update","required":true,"schema":{"type":"string"}}],"requestBody":{"$ref":"#/components/requestBodies/SetupPermissionsPatch"},"responses":{"200":{"description":"Permission role updated. Returns an empty body."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"}},"tags":["Setup"]}},"/v2/setup/reportAccess":{"get":{"description":"Fetch list of report access","operationId":"setup_reportAccess","parameters":[{"in":"query","name":"showDeleted","description":"Include deleted items","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ReportAccessDetail"}},"example":[{"id":"cmVwb3J0QWNjZXNzOjQ1Mzg","name":"Manager","sales_reports":true,"labor_reports":true,"payroll_reports":true,"loyalty_reports":false,"gift_reports":false,"batch_cc_reports":true,"assigned_staff":[{"staff_id":"c3RhZmY6MTIzNDU2"},{"staff_id":"c3RhZmY6Nzg5MDEy"}]},{"id":"cmVwb3J0QWNjZXNzOjIyNjc","name":"Admin","sales_reports":false,"labor_reports":false,"payroll_reports":false,"loyalty_reports":false,"gift_reports":false,"batch_cc_reports":false,"assigned_staff":[]}]}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Setup"]},"post":{"description":"Create a new report access","operationId":"setup_createReportAccess","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateReportAccess"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportAccessDetail"},"example":{"id":"cmVwb3J0QWNjZXNzOjEyNTMzMw==","name":"Manager Reports","sales_reports":true,"labor_reports":true,"payroll_reports":true,"loyalty_reports":true,"gift_reports":true,"batch_cc_reports":true,"assigned_staff":[{"staff_id":"c3RhZmY6MTI2MDIwMg=="}]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Setup"]}},"/v2/setup/reportAccess/{id}":{"patch":{"description":"Partially update an existing report access. All fields are optional; omitted fields remain unchanged. When `assigned_staff` are included, they replace the full existing set for that field.","operationId":"setup_patchReportAccess","parameters":[{"in":"path","name":"id","description":"Base64-encoded GraphID (key: reportAccess)","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchReportAccess"}}}},"responses":{"200":{"description":"Report access updated. Returns an empty body."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"description":"Not Found. Example message: `assigned_staff entry 'staff:c3RhZmY6MTIwNjIwNg==' does not reference a valid staff member.`"}},"tags":["Setup"]},"put":{"description":"Fully replaces a report access. Only name is required; Any field not provided is reset (flags to false, arrays cleared).","operationId":"setup_putReportAccess","parameters":[{"in":"path","name":"id","description":"Base64-encoded GraphID (key: reportAccess)","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PutReportAccess"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportAccessDetail"},"example":{"id":"cmVwb3J0QWNjZXNzOjEyNTMzMw==","name":"Manager Reports","sales_reports":true,"labor_reports":true,"payroll_reports":true,"loyalty_reports":true,"gift_reports":true,"batch_cc_reports":true,"assigned_staff":[{"staff_id":"c3RhZmY6MTI2MDIwMg=="}]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"description":"Not Found. Example message: `assigned_staff entry 'staff:c3RhZmY6MTIwNjIwNg==' does not reference a valid staff member.`"}},"tags":["Setup"]}},"/v2/stock/ingredients/{id}":{"get":{"summary":"Retrieve stock values for an ingredient","description":"Returns the stock level for a specific ingredient","operationId":"stock_ingredients_get","parameters":[{"in":"path","name":"id","description":"ID of the ingredient","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"id":"aW5ncmVkaWVudDoxNDUyODA=","stock":-1}}}}},"tags":["Stock"]},"patch":{"summary":"Update stock values for an ingredient","description":"Updates the stock level for a specific ingredient","operationId":"stock_ingredients_patch","parameters":[{"in":"path","name":"id","description":"ID of the ingredient","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StockItem"}}},"description":"Stock level for the ingredient (0 means out of stock) (-1 means unlimited stock)","required":true},"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"id":"aW5ncmVkaWVudDoxNDUyODA=","stock":-1}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"description":"Stock item not found"}},"tags":["Stock"]}},"/v2/stock/ingredients":{"get":{"summary":"Retrieve stock values for all ingredients","description":"Returns a list of all ingredients with their current stock levels","operationId":"stock_ingredients_list","responses":{"200":{"description":"OK","content":{"application/json":{"example":[{"id":"aW5ncmVkaWVudDoxNDUyODA=","stock":-1}]}}}},"tags":["Stock"]}},"/v2/stock/items/{id}":{"get":{"summary":"Retrieve stock values for an item","description":"Returns the stock level for a specific item","operationId":"stock_items_get","parameters":[{"in":"path","name":"id","description":"ID of the item","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"id":"aW5ncmVkaWVudDoxNDUyODA=","stock":-1}}}}},"tags":["Stock"]},"patch":{"summary":"Update stock values for an item","description":"Updates the stock level for a specific item","operationId":"stock_items_patch","parameters":[{"in":"path","name":"id","description":"ID of the item","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StockItem"}}},"required":true},"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"id":"aW5ncmVkaWVudDoxNDUyODA=","stock":-1}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"description":"Stock item not found"}},"tags":["Stock"]}},"/v2/stock/items":{"get":{"summary":"Retrieve stock values for all items","description":"Returns a list of all items with their current stock levels","operationId":"stock_items_list","responses":{"200":{"description":"OK","content":{"application/json":{"example":[{"id":"aW5ncmVkaWVudDoxNDUyODA=","stock":-1}]}}}},"tags":["Stock"]}},"/v2/webhooks/webhook_endpoint":{"get":{"summary":"Get a list of all webhook endpoints registered with Heartland Restaurant","description":"Fetch list of all the registered webhook endpoints.","operationId":"webhook_endpoint_get","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WebhookEndpointPost"}},"example":[{"id":"YnJlYWtUeXBlOjE=","url":"https://integrator.com/webhook/endpoint","enabled_events":["labor.punch"]},{"id":"wkBiBUK8p0t","url":"https://anotherDomain.com/webhook/endpoint","enabled_events":["*"]}]}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Webhook"]},"post":{"summary":"Register a new webhook endpoint with Heartland Restaurant","description":"Register a new webhook endpoint with Heartland Restaurant. A webhook endpoint request must have a `url` and a list of `enabled_events`. See `EnabledEvent` model for more details and the description below.\n\n`enabled_events enumeration`\n\n------------\n\n`*`\n\nOccurs for all possible events. The structure of the data is dependent on individual event type.\n\n------------\n\n`ticket.all`\n\nOccurs when a ticket is created or modified within Heartland Restaurant.\n\nPlease see reports ticket request for an example of the event data.\n\n------------\n\n`ticket.openClose`\n\nDEPRECATED EVENT TYPE. Please use `ticket.all`.\n\n------------\n\n`labor.punch`\n\nOccurs when a time punch is created or updated within Heartland Restaurant.\n\nPlease see punches request for an example of the event data.\n\n------------\n\n`item.stock`\n\nOccurs when a item stock is updated within Heartland Restaurant.\n\n------------\n\n`setup.scheduledShifts`\n\nOccurs when a scheduled shift is created or updated within Heartland Restaurant.\n\nPlease see scheduled shifts request for an example of the event data.\n\n------------\n\n`setup.staff`\n\nOccurs when a staff member is created or updated within Heartland Restaurant.\n\n------------\n\n`menu.published`\n\nOccurs after a menu is published within Heartland Restaurant. The event data contains `location_id`, `published_when` (ISO 8601 timestamp), and `affected_resources` (an array of the menu resource types that changed, e.g. `[\"items\",\"modifiers\",\"sections\",\"groups\"]`; empty when no menu resources changed).","operationId":"webhook_endpoint_post","requestBody":{"$ref":"#/components/requestBodies/WebhookEndpoint"},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEndpointPost"},"example":{"id":"dGltZXB1bmNoOkQ4OEYyRERELTk5MEItNDQxRC1CQ0E2LTQ1NDgyQjQwQUFBNQ==","url":"https://integrator.com/webhook/endpoint","enabled_events":["labor.punch"]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"callbacks":{"ticketEvent":{"{$request.body#/url}":{"post":{"summary":"Ticket event callback","description":"Fired when a ticket is created or modified in Heartland Restaurant","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"event_id":{"type":"string"},"type":{"type":"string","enum":["ticket.all"]},"created":{"type":"number","description":"Unix timestamp"},"data":{"type":"object","description":"Ticket event payload — see reports ticket endpoint for structure"}}}}}},"responses":{"200":{"description":"Partner endpoint acknowledges receipt"}}}}},"laborPunchEvent":{"{$request.body#/url}":{"post":{"summary":"Labor punch event callback","description":"Fired when a time punch is created or updated in Heartland Restaurant","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"event_id":{"type":"string"},"type":{"type":"string","enum":["labor.punch"]},"created":{"type":"number","description":"Unix timestamp"},"data":{"type":"object","description":"Labor punch event payload — see punches endpoint for structure"}}}}}},"responses":{"200":{"description":"Partner endpoint acknowledges receipt"}}}}},"itemStockEvent":{"{$request.body#/url}":{"post":{"summary":"Item stock event callback","description":"Fired when item stock is updated in Heartland Restaurant","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"event_id":{"type":"string"},"type":{"type":"string","enum":["item.stock"]},"created":{"type":"number","description":"Unix timestamp"},"data":{"type":"object","description":"Item stock event payload"}}}}}},"responses":{"200":{"description":"Partner endpoint acknowledges receipt"}}}}},"menuPublishedEvent":{"{$request.body#/url}":{"post":{"summary":"Menu published event callback","description":"Fired after a menu is published in Heartland Restaurant","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"event_id":{"type":"string"},"object":{"type":"string","enum":["event"]},"type":{"type":"string","enum":["menu.published"]},"created":{"type":"number","description":"Unix timestamp"},"event_created":{"type":"number","description":"Unix timestamp of when the event was created"},"location_number":{"type":"string","description":"Account/location number the event belongs to"},"data":{"type":"object","properties":{"location_id":{"type":"integer"},"published_when":{"type":"string","format":"date-time","description":"ISO 8601 timestamp of when the menu publish completed"},"affected_resources":{"type":"array","description":"Menu resource types that changed in this publish. Use it to know which `/v2/menu/*` endpoints to re-pull. Empty when no menu resources changed.","items":{"type":"string","enum":["items","modifiers","sections","groups","sizes","ingredients","taxes","discounts","tags","attributes","adjustments","contextItems"]}}}}}},"example":{"location_number":"6811482356","event_id":"6b2d9c1a3f7e4","object":"event","created":1780497605,"type":"menu.published","event_created":1780497605,"data":{"location_id":114823,"published_when":"2026-06-03T18:40:05+00:00","affected_resources":["items","modifiers","sections","groups"]}}}}},"responses":{"200":{"description":"Partner endpoint acknowledges receipt"}}}}}},"tags":["Webhook"]}},"/v2/webhooks/webhook_endpoint/{id}":{"put":{"summary":"Update a `url` or `enabled_events` for a webhook endpoint registered with Heartland Restaurant","description":"Update a `url` or `enabled_events` for a registered webhook endpoint. See webhook endpoint post for more information on `enabled_events`.","operationId":"webhook_endpoint_put","parameters":[{"in":"path","name":"id","description":"","required":true,"schema":{"type":"string"}}],"requestBody":{"$ref":"#/components/requestBodies/WebhookEndpoint"},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEndpointResponsePut"},"example":{"id":"dGltZXB1bmNoOkQ4OEYyRERELTk5MEItNDQxRC1CQ0E2LTQ1NDgyQjQwQUFBNQ==","url":"https://integrator.com/webhook/endpoint","enabled_events":["labor.punch"]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Webhook"]},"delete":{"summary":"Delete a webhook endpoint registered with Heartland Restaurant","description":"Delete a registered endpoint.","operationId":"webhook_endpoint_delete","parameters":[{"in":"path","name":"id","description":"ID for a registered endpoint","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteResponseType"},"example":{"success":true}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Webhook"]}},"/v2/webhooks/authorization":{"post":{"summary":"Register an api token with Heartland Restaurant to authenticate webhook events from Heartland Restaurant.","description":"Specify a `Bearer` token uses for authorization for webhook event requests from Heartland Restaurant.","operationId":"webhook_authorization_post","requestBody":{"$ref":"#/components/requestBodies/WebhookAuthorizationPost"},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookAuthorizationPost"},"example":{"token":"dGltZXB1bmNoOkQ4OEYyRERELTk5MEItNDQxRC1CQ0E2LTQ1NDgyQjQwQUFBNQ=="}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Webhook"]},"put":{"summary":"Update an api token with Heartland Restaurant to authenticate webhook events from Heartland Restaurant.","description":"Update the `Bearer` token uses for authorization for webhook event requests from Heartland Restaurant.","operationId":"webhook_authorization_put","requestBody":{"$ref":"#/components/requestBodies/WebhookAuthorizationPost"},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookAuthorizationPost"},"example":{"token":"dGltZXB1bmNoOkQ4OEYyRERELTk5MEItNDQxRC1CQ0E2LTQ1NDgyQjQwQUFBNQ=="}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Webhook"]},"delete":{"summary":"Remove authorization from requests for webhook endpoints.","description":"Removes authorization token from Heartland Restaurant webhooks to registered endpoints.","operationId":"webhook_authorization_delete","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteResponseType"},"example":{"success":true}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Webhook"]}},"/v2/webhooks/failed_events":{"get":{"summary":"Get a list of failed events.","description":"Fetch list of all the failed events. Records are retained for 1 week. Events are triggered within Heartland Restaurant and are dispatched to a webhook url with any applicable authorization. Any event that returns a value other than 200 HTTP status code will be considered a failed event. Heartland Restaurant will retry failed events a maximum of 10 times.","operationId":"webhook_failed_events_get","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/FailedWebhookEvent"}},"example":[{"event_id":"aijoi-12312-asdkjflasf","location_number":"6811482356","object":"event","created":1628606658,"type":"labor.punch","event_created":1628606000,"data":{}},{"event_id":"koiwekjl-9807-uoiqupoi","location_number":"6811482356","object":"event","created":1628606658,"type":"labor.punch","event_created":1628606000,"data":{}}]}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"tags":["Webhook"]}},"/v2/webhooks/failed_events/{id}":{"get":{"summary":"Get a failed event by an event id.","description":"Get one failed event by an event id.","operationId":"webhook_failed_events_id_get","parameters":[{"in":"path","name":"id","description":"","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FailedWebhookEvent"},"example":{"event_id":"koiwekjl-9807-uoiqupoi","location_number":"6811482356","object":"event","created":1628606658,"type":"labor.punch","event_created":1628606000,"data":{}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"description":"Not Found. No retained failed event matches the event ID for the current API key. Example message: `No event found with event_id of <id>`."}},"tags":["Webhook"]}}},"servers":[{"url":"https://api.hrpos.heartland.us"}]}