{"openapi":"3.1.0","info":{"title":"Honeycomb Restaurant API","description":"Forwards to rice on behalf of an organization's own API key. No database, no independent auth — rice's own errors are passed through unchanged.","version":"0.1.0"},"paths":{"/health":{"get":{"tags":["Meta"],"summary":"Health","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Health Health Get"}}}}}}},"/v3/restaurants":{"get":{"tags":["Restaurants"],"summary":"List every restaurant in your organization","description":"Lists all restaurants belonging to the organization your API key is scoped to. There's no organization id to pass — your key already identifies exactly one organization.","operationId":"list_restaurants_v3_restaurants_get","parameters":[{"name":"X-Api-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RestaurantListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v3/restaurants/{restaurant_id}/menu":{"get":{"tags":["Restaurants"],"summary":"Get a restaurant's full menu","description":"Every section, item, allergen, nutrition value, image, verification status, and cross-restaurant link summary for one restaurant's menu. This is the admin/editor view (includes unverified/unpublished items), not the public guest menu.","operationId":"get_menu_v3_restaurants__restaurant_id__menu_get","parameters":[{"name":"restaurant_id","in":"path","required":true,"schema":{"type":"integer","title":"Restaurant Id"}},{"name":"X-Api-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MenuResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v3/items/{item_id}":{"put":{"tags":["Items"],"summary":"Update a menu item","description":"Edit an existing item's fields. Set apply_to_linked_items=true to push this same edit to every item currently linked to it (across restaurants) instead of just this one — see the field's own description for the caveat on what else comes along.","operationId":"update_item_v3_items__item_id__put","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","title":"Item Id"}},{"name":"X-Api-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateItemRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MenuItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Items"],"summary":"Remove a menu item","description":"Soft-deletes the item — rice moves it into a per-restaurant graveyard menu rather than a hard delete, so this is safe to call without an extra confirmation step.","operationId":"delete_item_v3_items__item_id__delete","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","title":"Item Id"}},{"name":"X-Api-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenericStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v3/restaurants/{restaurant_id}/items":{"post":{"tags":["Items"],"summary":"Add a new menu item","description":"Create a new item on the given restaurant's menu.","operationId":"create_item_v3_restaurants__restaurant_id__items_post","parameters":[{"name":"restaurant_id","in":"path","required":true,"schema":{"type":"string","title":"Restaurant Id"}},{"name":"X-Api-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateItemRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MenuItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v3/items/{item_id}/modifiers":{"post":{"tags":["Item Links"],"summary":"Add a modifier to an item, optionally applied to every linked item","description":"Creates a modifier (add-on/option) on this item. Set apply_to_linked_items=true to also push it to every item this one is linked to, across restaurants — this also re-syncs the source item's other default fields to those targets, since rice propagates item fields and modifiers together (see this field's own description).","operationId":"add_modifier_to_linked_items_v3_items__item_id__modifiers_post","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","title":"Item Id"}},{"name":"X-Api-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddModifierRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddModifierResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v3/items/{item_id}/links":{"get":{"tags":["Item Links"],"summary":"List the restaurants/items a given item is linked to","description":"Shows this item's role in its cross-restaurant family (standalone/linked/source) and every item it's actively linked to, with each link's sync status.","operationId":"list_item_links_v3_items__item_id__links_get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","title":"Item Id"}},{"name":"X-Api-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ItemLinksResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"AddModifierRequest":{"properties":{"restaurant_id":{"type":"string","title":"Restaurant Id"},"modifier":{"$ref":"#/components/schemas/ModifierInput"},"apply_to_linked_items":{"type":"boolean","title":"Apply To Linked Items","description":"false (default): the modifier only applies to this item. true: after creating the modifier, also sync this item to every linked item — which brings the modifier along, but also re-syncs the source item's other default fields to those targets (rice propagates modifiers and item fields together; there's no way to sync modifiers alone yet).","default":false}},"type":"object","required":["restaurant_id","modifier"],"title":"AddModifierRequest"},"AddModifierResponse":{"properties":{"modifier":{"$ref":"#/components/schemas/ModifierResult"},"synced_item_ids":{"items":{"type":"integer"},"type":"array","title":"Synced Item Ids","description":"Item ids the modifier (and source item's other fields) were propagated to. Empty if apply_to_linked_items was false."}},"type":"object","required":["modifier"],"title":"AddModifierResponse"},"CreateItemRequest":{"properties":{"restaurant_id":{"type":"string","title":"Restaurant Id"},"item":{"$ref":"#/components/schemas/ItemFields"}},"type":"object","required":["restaurant_id","item"],"title":"CreateItemRequest"},"GenericStatusResponse":{"properties":{"status":{"type":"string","title":"Status"},"id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Id"}},"type":"object","required":["status"],"title":"GenericStatusResponse"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ItemFields":{"properties":{"id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Id","description":"Omit to create a new item; include to edit an existing one"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"section":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Section"},"price":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Price","description":"e.g. '$12.00'"},"additionalInfo":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Additionalinfo"},"allergens":{"items":{"type":"string"},"type":"array","title":"Allergens"},"traceAllergens":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Traceallergens"},"isActive":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Isactive"},"verified":{"type":"boolean","title":"Verified","default":false},"modifiable":{"items":{"type":"string"},"type":"array","title":"Modifiable"},"image":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image"},"nutritional_info":{"$ref":"#/components/schemas/NutritionInput"}},"additionalProperties":true,"type":"object","title":"ItemFields","description":"Editable item fields for POST /item on rice.\n\nallergens, modifiable, nutritional_info, and verified are REQUIRED here even though\nthey sound like they should be optional patch fields — rice's own update path reads\nitem[\"allergens\"] / item[\"modifiable\"] / item[\"nutritional_info\"][\"calories\"] (etc.) /\nitem[\"verified\"] unconditionally with no default, so omitting any of them on an\nupdate crashes rice with a KeyError rather than leaving the field unchanged. This\nschema states that contract honestly instead of silently working around it — send\nthe item's full current state, not a sparse patch."},"ItemLink":{"properties":{"link_id":{"type":"integer","title":"Link Id"},"target_item_id":{"type":"integer","title":"Target Item Id"},"target_item_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Item Name"},"target_restaurant_id":{"type":"integer","title":"Target Restaurant Id"},"target_restaurant_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Restaurant Name"},"sync_status":{"type":"string","title":"Sync Status","description":"'synced' or 'pending_sync'"}},"type":"object","required":["link_id","target_item_id","target_restaurant_id","sync_status"],"title":"ItemLink"},"ItemLinksResponse":{"properties":{"item_id":{"type":"integer","title":"Item Id"},"role":{"type":"string","title":"Role","description":"'standalone', 'linked', or 'source'"},"sharing_enabled":{"type":"boolean","title":"Sharing Enabled"},"outgoing_links":{"items":{"$ref":"#/components/schemas/ItemLink"},"type":"array","title":"Outgoing Links"}},"type":"object","required":["item_id","role","sharing_enabled"],"title":"ItemLinksResponse"},"MenuItem":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"description":{"type":"string","title":"Description","default":""},"section":{"type":"string","title":"Section"},"price":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Price","description":"Formatted price, e.g. '$12.00'"},"additional_info":{"type":"string","title":"Additional Info","default":""},"is_active":{"type":"boolean","title":"Is Active","default":true},"verified":{"type":"boolean","title":"Verified","description":"Whether this item's allergen/nutrition data has been human-verified","default":false},"allergens":{"items":{"type":"string"},"type":"array","title":"Allergens"},"trace_allergens":{"items":{"type":"string"},"type":"array","title":"Trace Allergens"},"nutrition":{"$ref":"#/components/schemas/NutritionInfo"},"modifiable":{"items":{"type":"string"},"type":"array","title":"Modifiable","description":"Modifier group names available on this item"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url"},"upsells":{"items":{},"type":"array","title":"Upsells"},"family_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Family Id"},"linked_item_count":{"type":"integer","title":"Linked Item Count","description":"How many other items (across restaurants) share this item's family","default":0},"link_role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Link Role","description":"'standalone', 'linked', or 'source' — this item's role in its family"},"has_divergent_siblings":{"type":"boolean","title":"Has Divergent Siblings","description":"True if linked items have drifted out of sync with this one","default":false},"row_version":{"type":"integer","title":"Row Version","default":0}},"type":"object","required":["id","name","section"],"title":"MenuItem"},"MenuResponse":{"properties":{"restaurant_id":{"type":"integer","title":"Restaurant Id"},"sections":{"items":{"$ref":"#/components/schemas/MenuSection"},"type":"array","title":"Sections"}},"type":"object","required":["restaurant_id"],"title":"MenuResponse"},"MenuSection":{"properties":{"name":{"type":"string","title":"Name"},"info":{"type":"string","title":"Info","default":""},"items":{"items":{"$ref":"#/components/schemas/MenuItem"},"type":"array","title":"Items"}},"type":"object","required":["name"],"title":"MenuSection"},"ModifierInput":{"properties":{"name":{"type":"string","title":"Name","default":""},"description":{"type":"string","title":"Description","default":""},"price_delta_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Price Delta Cents"},"added_allergens":{"items":{"type":"string"},"type":"array","title":"Added Allergens"},"removed_allergens":{"items":{"type":"string"},"type":"array","title":"Removed Allergens"},"nutritional_delta":{"anyOf":[{"additionalProperties":{"type":"number"},"type":"object"},{"type":"null"}],"title":"Nutritional Delta"}},"additionalProperties":true,"type":"object","title":"ModifierInput"},"ModifierResult":{"properties":{"id":{"type":"integer","title":"Id"},"status":{"type":"string","title":"Status"}},"type":"object","required":["id","status"],"title":"ModifierResult"},"NutritionInfo":{"properties":{"calories":{"type":"number","title":"Calories","default":0},"protein":{"type":"number","title":"Protein","default":0},"carbs":{"type":"number","title":"Carbs","default":0},"fat":{"type":"number","title":"Fat","default":0},"micro_nutrients":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Micro Nutrients","description":"Micronutrient values keyed by nutrient name, e.g. {'sodium': {'value': 200, 'unit': 'mg'}}"}},"type":"object","title":"NutritionInfo"},"NutritionInput":{"properties":{"calories":{"type":"number","title":"Calories","default":0},"protein":{"type":"number","title":"Protein","default":0},"carbs":{"type":"number","title":"Carbs","default":0},"fat":{"type":"number","title":"Fat","default":0}},"type":"object","title":"NutritionInput"},"RestaurantListResponse":{"properties":{"organization_id":{"type":"string","title":"Organization Id"},"restaurants":{"items":{"$ref":"#/components/schemas/RestaurantSummary"},"type":"array","title":"Restaurants"}},"type":"object","required":["organization_id"],"title":"RestaurantListResponse"},"RestaurantSummary":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"slug":{"type":"string","title":"Slug"},"is_active":{"type":"boolean","title":"Is Active","default":true},"address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address"},"phone_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone Number"},"image":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image"}},"type":"object","required":["id","name","slug"],"title":"RestaurantSummary"},"UpdateItemRequest":{"properties":{"restaurant_id":{"type":"string","title":"Restaurant Id"},"item":{"$ref":"#/components/schemas/ItemFields"},"apply_to_linked_items":{"type":"boolean","title":"Apply To Linked Items","description":"false (default): update only this item. true: also push this edit to every item currently linked to it, in every restaurant the link reaches. Linked items are resynced on their default field set, not just the fields you changed here — that's rice's own propagation behavior, not something this service can narrow down further today.","default":false}},"type":"object","required":["restaurant_id","item"],"title":"UpdateItemRequest"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}