Skip to main content
A menu in Fire is a full catalog definition for a specific store and channel combination — including categories, products, modifier groups, and schedules. The payload is self-contained and ready to be forwarded to downstream systems. Treat it as an upsert: create the menu if it doesn’t exist, replace it entirely if it does.

Payload

{
  "event": {
    "id": "evt_def456",
    "type": "menu.updated",
    "executionId": "exec_abc123",
    "createdAt": "2025-01-15T14:31:00.000Z"
  },
  "data": {
    "account": "1",
    "country": "EC",
    "groupId": "a3f7c2d1-84be-4e10-9b3a-2c5d6e7f8091",
    "menu": {
      "list": {
        "listId": "805-iFood-delivery",
        "listName": "iFood - Store 805",
        "vendorId": "100.6.1350",
        "storeId": "805",
        "storeName": "Laboratorio Ecuador",
        "timezone": "America/Guayaquil",
        "channelId": "0E049503-85CF-E511-80C6-000D3A3261F3",
        "channelReferenceName": "iFood",
        "schedules": [
          { "day": "MONDAY",    "startTime": "07:00", "endTime": "23:00" },
          { "day": "TUESDAY",   "startTime": "07:00", "endTime": "23:00" },
          { "day": "WEDNESDAY", "startTime": "07:00", "endTime": "23:00" },
          { "day": "THURSDAY",  "startTime": "07:00", "endTime": "23:00" },
          { "day": "FRIDAY",    "startTime": "07:00", "endTime": "23:30" },
          { "day": "SATURDAY",  "startTime": "08:00", "endTime": "23:30" },
          { "day": "SUNDAY",    "startTime": "08:00", "endTime": "22:00" }
        ]
      },
      "categories": [
        {
          "productCategoryId": "cat_001",
          "name": "Burgers",
          "displayInList": true,
          "featured": false,
          "position": 1,
          "images": [
            {
              "imageCategoryId": "img_cat_001",
              "fileUrl": "https://cdn.example.com/categories/burgers.jpg"
            }
          ],
          "productListing": [
            { "productId": "prod_001", "position": 1 }
          ],
          "schedules": [
            { "day": "MONDAY",    "startTime": "11:00", "endTime": "23:00" },
            { "day": "TUESDAY",   "startTime": "11:00", "endTime": "23:00" },
            { "day": "WEDNESDAY", "startTime": "11:00", "endTime": "23:00" },
            { "day": "THURSDAY",  "startTime": "11:00", "endTime": "23:00" },
            { "day": "FRIDAY",    "startTime": "11:00", "endTime": "23:30" },
            { "day": "SATURDAY",  "startTime": "11:00", "endTime": "23:30" },
            { "day": "SUNDAY",    "startTime": "11:00", "endTime": "22:00" }
          ]
        },
        {
          "productCategoryId": "cat_002",
          "name": "Breakfast",
          "displayInList": true,
          "featured": false,
          "position": 2,
          "images": [],
          "productListing": [
            { "productId": "prod_002", "position": 1 }
          ],
          "schedules": null
        }
      ],
      "products": [
        {
          "productId": "prod_001",
          "name": "Classic Burger",
          "description": "Beef patty, lettuce, tomato, pickles",
          "active": true,
          "type": "PRODUCT",
          "priceInfo": {
            "pointPrice": 0,
            "price": 1000,
            "referencePrice": 1200,
            "suggestedPrice": 1200
          },
          "productModifiers": [
            {
              "modifierId": "mod_001",
              "position": 1,
              "overrides": [
                {
                  "productId": "prod_size_small",
                  "priceInfo": {
                    "pointPrice": 0,
                    "price": 800,
                    "referencePrice": 800,
                    "suggestedPrice": 800
                  }
                }
              ]
            }
          ],
          "schedules": [
            { "day": "MONDAY",    "startTime": "11:00", "endTime": "23:00" },
            { "day": "TUESDAY",   "startTime": "11:00", "endTime": "23:00" },
            { "day": "WEDNESDAY", "startTime": "11:00", "endTime": "23:00" },
            { "day": "THURSDAY",  "startTime": "11:00", "endTime": "23:00" },
            { "day": "FRIDAY",    "startTime": "11:00", "endTime": "23:30" },
            { "day": "SATURDAY",  "startTime": "11:00", "endTime": "23:30" },
            { "day": "SUNDAY",    "startTime": "11:00", "endTime": "22:00" }
          ],
          "images": [
            {
              "imageCategoryId": "img_prod_001",
              "fileUrl": "https://cdn.example.com/products/classic-burger.jpg"
            }
          ],
          "taxInfo": [
            { "vatRatePercentage": 12 }
          ],
          "additionalInfo": {
            "externalCode": "11019#23211#231",
            "ncm": "21.00.21.32"
          }
        },
        {
          "productId": "prod_002",
          "name": "Pancakes",
          "description": "Fluffy pancakes with maple syrup",
          "active": true,
          "type": "PRODUCT",
          "priceInfo": {
            "pointPrice": 0,
            "price": 800,
            "referencePrice": 800,
            "suggestedPrice": 800
          },
          "productModifiers": [],
          "schedules": null,
          "images": [],
          "taxInfo": [
            { "vatRatePercentage": 12 }
          ],
          "additionalInfo": {
            "externalCode": "11019",
            "ncm": "19.05.90.90"
          }
        },
        {
          "productId": "prod_size_small",
          "name": "Small",
          "description": "Small size",
          "active": true,
          "type": "MODIFIER",
          "priceInfo": {
            "pointPrice": 0,
            "price": 0,
            "referencePrice": 0,
            "suggestedPrice": 0
          },
          "productModifiers": [],
          "schedules": null,
          "images": [],
          "additionalInfo": {
            "externalCode": "11020",
            "ncm": "21.00.21.32"
          }
        },
        {
          "productId": "prod_size_large",
          "name": "Large",
          "description": "Large size",
          "active": true,
          "type": "MODIFIER",
          "priceInfo": {
            "pointPrice": 0,
            "price": 200,
            "referencePrice": 200,
            "suggestedPrice": 200
          },
          "productModifiers": [],
          "schedules": null,
          "images": [],
          "additionalInfo": {
            "externalCode": "11021",
            "ncm": "21.00.21.32"
          }
        }
      ],
      "modifierGroups": [
        {
          "modifierId": "mod_001",
          "modifier": "Choose your size",
          "minOptions": 1,
          "maxOptions": 1,
          "type": "RADIO",
          "modifierOptions": [
            { "optionId": "opt_001", "productId": "prod_size_small", "name": "Small", "position": 1 },
            { "optionId": "opt_002", "productId": "prod_size_large", "name": "Large", "position": 2 }
          ]
        }
      ]
    }
  }
}

Fields

data

FieldTypeDescription
accountstringAccount identifier
countrystringISO 3166-1 alpha-2 country code (e.g. EC, BR, CO) — required by downstream systems
groupIdstringUUID that correlates events from the same publication or sync batch. Multiple menu.updated events emitted together share the same groupId.
menuobjectComplete menu definition

data.menu

FieldTypeDescription
listobjectMenu metadata and channel/store association
categoriesobject[]Menu categories
productsobject[]Product catalog
modifierGroupsobject[]Modifier groups and options

data.menu.list

FieldTypeDescription
listIdstringComposite identifier: {storeNumber}-{channelCode}-{fulfillmentType}
listNamestringHuman-readable menu label (e.g. "iFood - Store 805") — not the store’s operational name
vendorIdstring | numberBrand code
storeIdstringStore number (store_number)
storeNamestringStore operational name. Fallback: "Store #{store_number}"
timezonestring | nullStore IANA timezone (e.g. America/Guayaquil). null if not configured
channelIdstringSales channel / fulfillment mapping UUID
channelReferenceNamestringFulfillment reference name (e.g. delivery, iFood)
schedulesobject[] | nullTime windows when this menu is active. Always present; null if no schedule applies

data.menu.list.schedules[n]

FieldTypeDescription
daystringDay of the week: MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
startTimestringOpening time in HH:mm format
endTimestringClosing time in HH:mm format

data.menu.categories[n]

FieldTypeDescription
productCategoryIdstringCategory identifier
namestringDisplay name
displayInListbooleanWhether the category is visible
featuredbooleanWhether the category is featured
positionnumberDisplay order
imagesobject[]Category images — { imageCategoryId, fileUrl }
productListingobject[]Products in this category with their positions — { productId, position }
schedulesobject[] | nullCategory-specific schedule. Always present; null if no schedule is configured

data.menu.products[n]

FieldTypeDescription
productIdstring | numberProduct identifier (externalId or UUID)
namestringProduct name
descriptionstringProduct description
activebooleanMenu visibility (visible); does not reflect stock or operational availability
typestringItem type: PRODUCTO, MODIFIER, COMPLEMENT, COMBO
priceInfoobjectResolved product prices
priceInfo.pointPricenumberPoints price
priceInfo.pricenumberResolved price (resolved_price / final_price; 0 for combos)
priceInfo.referencePricenumberReference price when applicable in catalog
priceInfo.suggestedPricenumberSuggested price when applicable in catalog
productModifiersobject[]Modifier group references — { modifierId, position, overrides? }
productModifiers[n].overridesobject[]Optional price overrides for specific options of this modifier on this product
schedulesobject[] | nullProduct custom schedule. Always present on all products[] items (incl. modifier option stubs); null if using store hours or no custom schedule
imagesobject[]Product images
taxInfoobject[]Tax information — { vatRatePercentage }
upsellingstringSuggested upselling product (optional)
additionalInfoobjectOptional extra metadata for the product
additionalInfo.externalCodestringExternal code identifying the product in a third-party system. May be a single code (e.g. 11019) or a composite key with # as separator (e.g. 11019#23211#231).
additionalInfo.ncmstringNCM (Nomenclatura Comum do Mercosul) fiscal classification code (e.g. 21.00.21.32).

data.menu.modifierGroups[n]

FieldTypeDescription
modifierIdstringModifier group identifier
modifierstringDisplay name of the modifier group
minOptionsnumberMinimum number of selections required
maxOptionsnumberMaximum number of selections allowed
typestringSelection type: RADIO (single) or CHECKBOX (multiple)
modifierOptionsobject[]Individual options within the group — each productId must exist in products

data.menu.modifierGroups[n].modifierOptions[n]

FieldTypeDescription
optionIdstringOption identifier
productIdstringProduct used as this option
namestringOption name
positionnumberDisplay order

Notes

  • The payload is a complete menu — not a diff. Replace the entire menu on the downstream system.
  • Every menu.modifierGroups[n].modifierOptions[n].productId must reference a product defined in menu.products.
  • The schedules fields on list, categories, and products are always present in the payload. Use null when no schedule applies; never omit the key.
  • list.schedules: inheritance fulfillment → channel → salesScheduleoperationSchedulenull.
  • categories[].schedules: category-specific schedule if it exists; null if none.
  • products[].schedules: only when the product has schedule mode: custom; null if using store hours or no custom schedule (implicitly inherits the list window).

Removing a menu externally

Fire does not emit a separate delete event for menus. To remove a menu from a downstream system, Fire sends a menu.updated event with menu.categories, menu.products, and menu.modifierGroups as empty arrays. Your system should treat an empty menu as a signal to deactivate or remove the menu externally.
{
  "event": {
    "id": "evt_def459",
    "type": "menu.updated",
    "executionId": "exec_abc124",
    "createdAt": "2025-01-15T14:31:00.000Z"
  },
  "data": {
    "account": "1",
    "country": "EC",
    "groupId": "a3f7c2d1-84be-4e10-9b3a-2c5d6e7f8091",
    "menu": {
      "list": { "..." : "..." },
      "categories": [],
      "products": [],
      "modifierGroups": []
    }
  }
}

Usage

See Menu publication for the full handling guide.