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": "Hamburguesas",
"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": "Desayunos",
"displayInList": true,
"featured": false,
"position": 2,
"images": [],
"productListing": [
{ "productId": "prod_002", "position": 1 }
],
"schedules": null
}
],
"products": [
{
"productId": "prod_001",
"name": "Hamburguesa Clásica",
"description": "Medallón de res, lechuga, tomate, pepinillos",
"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": "Panqueques",
"description": "Panqueques esponjosos con jarabe de maple",
"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": "Pequeño",
"description": "Tamaño pequeño",
"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": "Grande",
"description": "Tamaño grande",
"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": "Elige tu tamaño",
"minOptions": 1,
"maxOptions": 1,
"type": "RADIO",
"modifierOptions": [
{ "optionId": "opt_001", "productId": "prod_size_small", "name": "Pequeño", "position": 1 },
{ "optionId": "opt_002", "productId": "prod_size_large", "name": "Grande", "position": 2 }
]
}
]
}
}
}
Campos
data
| Campo | Tipo | Descripción |
|---|---|---|
account | string | Identificador de la cuenta |
country | string | Código de país ISO 3166-1 alpha-2 (p. ej. EC, BR, CO) — requerido por sistemas externos |
groupId | string | UUID que correlaciona eventos del mismo batch de publicación o sincronización. Varios eventos menu.updated emitidos juntos comparten el mismo groupId. |
menu | object | Definición completa del menú |
data.menu
| Campo | Tipo | Descripción |
|---|---|---|
list | object | Metadatos del menú y asociación canal/tienda |
categories | object[] | Categorías del menú |
products | object[] | Catálogo de productos |
modifierGroups | object[] | Grupos de modificadores y opciones |
data.menu.list
| Campo | Tipo | Descripción |
|---|---|---|
listId | string | Identificador compuesto: {storeNumber}-{channelCode}-{fulfillmentType} |
listName | string | Etiqueta legible del menú (p. ej. "iFood - Store 805") — no es el nombre operativo de la tienda |
vendorId | string | number | Código de marca |
storeId | string | Número de tienda (store_number) |
storeName | string | Nombre operativo de la tienda. Fallback: "Store #{store_number}" |
timezone | string | null | Zona horaria IANA de la tienda (p. ej. America/Guayaquil). null si no está configurada |
channelId | string | UUID del canal de ventas / fulfillment mapping |
channelReferenceName | string | Nombre de referencia del fulfillment (p. ej. delivery, iFood) |
schedules | object[] | null | Ventanas de tiempo en las que este menú está activo. Siempre presente; null si no hay horario aplicable |
data.menu.list.schedules[n]
| Campo | Tipo | Descripción |
|---|---|---|
day | string | Día de la semana: MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY |
startTime | string | Hora de apertura en formato HH:mm |
endTime | string | Hora de cierre en formato HH:mm |
data.menu.categories[n]
| Campo | Tipo | Descripción |
|---|---|---|
productCategoryId | string | Identificador de categoría |
name | string | Nombre para mostrar |
displayInList | boolean | Si la categoría es visible |
featured | boolean | Si la categoría está destacada |
position | number | Orden de visualización |
images | object[] | Imágenes de la categoría — { imageCategoryId, fileUrl } |
productListing | object[] | Productos de esta categoría con sus posiciones — { productId, position } |
schedules | object[] | null | Horario propio de la categoría. Siempre presente; null si no hay horario configurado |
data.menu.products[n]
| Campo | Tipo | Descripción |
|---|---|---|
productId | string | number | Identificador del producto (externalId o UUID) |
name | string | Nombre del producto |
description | string | Descripción del producto |
active | boolean | Visibilidad en el menú (visible); no refleja stock ni disponibilidad operativa |
type | string | Tipo de ítem: PRODUCTO, MODIFIER, COMPLEMENT, COMBO |
priceInfo | object | Precios resueltos del producto |
priceInfo.pointPrice | number | Precio en puntos |
priceInfo.price | number | Precio resuelto (resolved_price / final_price; 0 para combos) |
priceInfo.referencePrice | number | Precio de referencia cuando aplica en catálogo |
priceInfo.suggestedPrice | number | Precio sugerido cuando aplica en catálogo |
productModifiers | object[] | Referencias de grupos de modificadores — { modifierId, position, overrides? } |
productModifiers[n].overrides | object[] | Overrides opcionales de precio para opciones específicas de este modificador en este producto |
schedules | object[] | null | Horario custom del producto. Siempre presente en todos los ítems de products[] (incl. stubs de opciones modifier); null si usa horario de tienda o no tiene horario custom |
images | object[] | Imágenes del producto |
taxInfo | object[] | Información fiscal — { vatRatePercentage } |
upselling | string | Producto sugerido para upselling (opcional) |
additionalInfo | object | Metadata adicional opcional del producto |
additionalInfo.externalCode | string | Código externo que identifica el producto en un sistema de terceros. Puede ser un código simple (p. ej. 11019) o una clave compuesta con # como separador (p. ej. 11019#23211#231). |
additionalInfo.ncm | string | Código de clasificación fiscal NCM (Nomenclatura Común del Mercosur, p. ej. 21.00.21.32). |
data.menu.modifierGroups[n]
| Campo | Tipo | Descripción |
|---|---|---|
modifierId | string | Identificador del grupo de modificadores |
modifier | string | Nombre para mostrar del grupo |
minOptions | number | Número mínimo de selecciones requeridas |
maxOptions | number | Número máximo de selecciones permitidas |
type | string | Tipo de selección: RADIO (single) o CHECKBOX (multiple) |
modifierOptions | object[] | Opciones individuales del grupo — cada productId debe existir en products |
data.menu.modifierGroups[n].modifierOptions[n]
| Campo | Tipo | Descripción |
|---|---|---|
optionId | string | Identificador de la opción |
productId | string | Producto usado como esta opción |
name | string | Nombre de la opción |
position | number | Orden de visualización |
Notas
- El payload es un menú completo — no un diff. Reemplaza el menú completo en el sistema externo.
- Cada
menu.modifierGroups[n].modifierOptions[n].productIddebe referenciar un producto definido enmenu.products. - Los campos
schedulesenlist, categorías y productos siempre están presentes en el payload. Usanullcuando no hay horario aplicable; nunca omitas la clave. list.schedules: herencia fulfillment → canal →salesSchedule→operationSchedule→null.categories[].schedules: horario propio de la categoría si existe;nullsi no hay.products[].schedules: solo cuando el producto tiene schedulemode: custom;nullsi usa horario de tienda o no tiene horario custom (hereda la ventana dellistimplícitamente).
Eliminar un menú externamente
Fire no emite un evento de borrado separado para menús. Para eliminar un menú de un sistema externo, Fire envía un eventomenu.updated con menu.categories, menu.products y menu.modifierGroups como arrays vacíos. Tu sistema debe interpretar un menú vacío como señal para desactivar o eliminar el menú externamente.
{
"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": []
}
}
}

