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": "Hambúrgueres",
"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": "Café da Manhã",
"displayInList": true,
"featured": false,
"position": 2,
"images": [],
"productListing": [
{ "productId": "prod_002", "position": 1 }
],
"schedules": null
}
],
"products": [
{
"productId": "prod_001",
"name": "X-Burguer Clássico",
"description": "Hambúrguer bovino, alface, tomate, picles",
"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": "Panquecas",
"description": "Panquecas fofas com calda de bordo",
"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": "Pequeno",
"description": "Tamanho pequeno",
"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": "Tamanho 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": "Escolha o tamanho",
"minOptions": 1,
"maxOptions": 1,
"type": "RADIO",
"modifierOptions": [
{ "optionId": "opt_001", "productId": "prod_size_small", "name": "Pequeno", "position": 1 },
{ "optionId": "opt_002", "productId": "prod_size_large", "name": "Grande", "position": 2 }
]
}
]
}
}
}
Campos
data
| Campo | Tipo | Descrição |
|---|---|---|
account | string | Identificador da conta |
country | string | Código do país ISO 3166-1 alpha-2 (ex.: EC, BR, CO) — necessário para sistemas externos |
groupId | string | UUID que correlaciona eventos do mesmo batch de publicação ou sincronização. Vários eventos menu.updated emitidos juntos compartilham o mesmo groupId. |
menu | object | Definição completa do menu |
data.menu
| Campo | Tipo | Descrição |
|---|---|---|
list | object | Metadados do menu e associação canal/loja |
categories | object[] | Categorias do menu |
products | object[] | Catálogo de produtos |
modifierGroups | object[] | Grupos de modificadores e opções |
data.menu.list
| Campo | Tipo | Descrição |
|---|---|---|
listId | string | Identificador composto: {storeNumber}-{channelCode}-{fulfillmentType} |
listName | string | Rótulo legível do menu (ex.: "iFood - Store 805") — não é o nome operacional da loja |
vendorId | string | number | Código da marca |
storeId | string | Número da loja (store_number) |
storeName | string | Nome operacional da loja. Fallback: "Store #{store_number}" |
timezone | string | null | Fuso horário IANA da loja (ex.: America/Guayaquil). null se não configurado |
channelId | string | UUID do canal de vendas / fulfillment mapping |
channelReferenceName | string | Nome de referência do fulfillment (ex.: delivery, iFood) |
schedules | object[] | null | Janelas de tempo em que este menu está ativo. Sempre presente; null se não houver horário aplicável |
data.menu.list.schedules[n]
| Campo | Tipo | Descrição |
|---|---|---|
day | string | Dia da semana: MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY |
startTime | string | Horário de abertura no formato HH:mm |
endTime | string | Horário de fechamento no formato HH:mm |
data.menu.categories[n]
| Campo | Tipo | Descrição |
|---|---|---|
productCategoryId | string | Identificador da categoria |
name | string | Nome de exibição |
displayInList | boolean | Se a categoria está visível |
featured | boolean | Se a categoria está em destaque |
position | number | Ordem de exibição |
images | object[] | Imagens da categoria — { imageCategoryId, fileUrl } |
productListing | object[] | Produtos desta categoria com suas posições — { productId, position } |
schedules | object[] | null | Horário próprio da categoria. Sempre presente; null se não houver horário configurado |
data.menu.products[n]
| Campo | Tipo | Descrição |
|---|---|---|
productId | string | number | Identificador do produto (externalId ou UUID) |
name | string | Nome do produto |
description | string | Descrição do produto |
active | boolean | Visibilidade no menu (visible); não reflete estoque nem disponibilidade operacional |
type | string | Tipo de item: PRODUCTO, MODIFIER, COMPLEMENT, COMBO |
priceInfo | object | Preços resolvidos do produto |
priceInfo.pointPrice | number | Preço em pontos |
priceInfo.price | number | Preço resolvido (resolved_price / final_price; 0 para combos) |
priceInfo.referencePrice | number | Preço de referência quando aplicável no catálogo |
priceInfo.suggestedPrice | number | Preço sugerido quando aplicável no catálogo |
productModifiers | object[] | Referências de grupos de modificadores — { modifierId, position, overrides? } |
productModifiers[n].overrides | object[] | Overrides opcionais de preço para opções específicas deste modificador neste produto |
schedules | object[] | null | Horário customizado do produto. Sempre presente em todos os itens de products[] (incl. stubs de opções modifier); null se usa horário da loja ou não tem horário customizado |
images | object[] | Imagens do produto |
taxInfo | object[] | Informação fiscal — { vatRatePercentage } |
upselling | string | Produto sugerido para upselling (opcional) |
additionalInfo | object | Metadados extras opcionais do produto |
additionalInfo.externalCode | string | Código externo que identifica o produto em um sistema de terceiros. Pode ser um código simples (ex.: 11019) ou uma chave composta com # como separador (ex.: 11019#23211#231). |
additionalInfo.ncm | string | Código de classificação fiscal NCM (Nomenclatura Comum do Mercosul, ex.: 21.00.21.32). |
data.menu.modifierGroups[n]
| Campo | Tipo | Descrição |
|---|---|---|
modifierId | string | Identificador do grupo de modificadores |
modifier | string | Nome de exibição do grupo |
minOptions | number | Número mínimo de seleções obrigatórias |
maxOptions | number | Número máximo de seleções permitidas |
type | string | Tipo de seleção: RADIO (single) ou CHECKBOX (multiple) |
modifierOptions | object[] | Opções individuais do grupo — cada productId deve existir em products |
data.menu.modifierGroups[n].modifierOptions[n]
| Campo | Tipo | Descrição |
|---|---|---|
optionId | string | Identificador da opção |
productId | string | Produto usado como esta opção |
name | string | Nome da opção |
position | number | Ordem de exibição |
Notas
- O payload é um menu completo — não um diff. Substitua o menu inteiro no sistema externo.
- Cada
menu.modifierGroups[n].modifierOptions[n].productIddeve referenciar um produto definido emmenu.products. - Os campos
schedulesemlist, categorias e produtos sempre estão presentes no payload. Usenullquando não houver horário aplicável; nunca omita a chave. list.schedules: herança fulfillment → canal →salesSchedule→operationSchedule→null.categories[].schedules: horário próprio da categoria se existir;nullse não houver.products[].schedules: apenas quando o produto tem schedulemode: custom;nullse usa horário da loja ou não tem horário customizado (herda a janela dolistimplicitamente).
Remover um menu externamente
O Fire não emite um evento de exclusão separado para menus. Para remover um menu de um sistema externo, o Fire envia um eventomenu.updated com menu.categories, menu.products e menu.modifierGroups como arrays vazios. Seu sistema deve interpretar um menu vazio como sinal para desativar ou remover o menu 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": []
}
}
}

