Saltar para o conteúdo principal
Um menu no Fire é a definição completa do catálogo para uma combinação específica de loja e canal — incluindo categorias, produtos, grupos de modificadores e horários. O payload é autocontido e pronto para ser encaminhado a sistemas externos. Trate-o como um upsert: crie o menu se não existir ou substitua-o inteiramente se já existir.

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

CampoTipoDescrição
accountstringIdentificador da conta
countrystringCódigo do país ISO 3166-1 alpha-2 (ex.: EC, BR, CO) — necessário para sistemas externos
groupIdstringUUID que correlaciona eventos do mesmo batch de publicação ou sincronização. Vários eventos menu.updated emitidos juntos compartilham o mesmo groupId.
menuobjectDefinição completa do menu

data.menu

CampoTipoDescrição
listobjectMetadados do menu e associação canal/loja
categoriesobject[]Categorias do menu
productsobject[]Catálogo de produtos
modifierGroupsobject[]Grupos de modificadores e opções

data.menu.list

CampoTipoDescrição
listIdstringIdentificador composto: {storeNumber}-{channelCode}-{fulfillmentType}
listNamestringRótulo legível do menu (ex.: "iFood - Store 805") — não é o nome operacional da loja
vendorIdstring | numberCódigo da marca
storeIdstringNúmero da loja (store_number)
storeNamestringNome operacional da loja. Fallback: "Store #{store_number}"
timezonestring | nullFuso horário IANA da loja (ex.: America/Guayaquil). null se não configurado
channelIdstringUUID do canal de vendas / fulfillment mapping
channelReferenceNamestringNome de referência do fulfillment (ex.: delivery, iFood)
schedulesobject[] | nullJanelas de tempo em que este menu está ativo. Sempre presente; null se não houver horário aplicável

data.menu.list.schedules[n]

CampoTipoDescrição
daystringDia da semana: MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
startTimestringHorário de abertura no formato HH:mm
endTimestringHorário de fechamento no formato HH:mm

data.menu.categories[n]

CampoTipoDescrição
productCategoryIdstringIdentificador da categoria
namestringNome de exibição
displayInListbooleanSe a categoria está visível
featuredbooleanSe a categoria está em destaque
positionnumberOrdem de exibição
imagesobject[]Imagens da categoria — { imageCategoryId, fileUrl }
productListingobject[]Produtos desta categoria com suas posições — { productId, position }
schedulesobject[] | nullHorário próprio da categoria. Sempre presente; null se não houver horário configurado

data.menu.products[n]

CampoTipoDescrição
productIdstring | numberIdentificador do produto (externalId ou UUID)
namestringNome do produto
descriptionstringDescrição do produto
activebooleanVisibilidade no menu (visible); não reflete estoque nem disponibilidade operacional
typestringTipo de item: PRODUCTO, MODIFIER, COMPLEMENT, COMBO
priceInfoobjectPreços resolvidos do produto
priceInfo.pointPricenumberPreço em pontos
priceInfo.pricenumberPreço resolvido (resolved_price / final_price; 0 para combos)
priceInfo.referencePricenumberPreço de referência quando aplicável no catálogo
priceInfo.suggestedPricenumberPreço sugerido quando aplicável no catálogo
productModifiersobject[]Referências de grupos de modificadores — { modifierId, position, overrides? }
productModifiers[n].overridesobject[]Overrides opcionais de preço para opções específicas deste modificador neste produto
schedulesobject[] | nullHorá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
imagesobject[]Imagens do produto
taxInfoobject[]Informação fiscal — { vatRatePercentage }
upsellingstringProduto sugerido para upselling (opcional)
additionalInfoobjectMetadados extras opcionais do produto
additionalInfo.externalCodestringCó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.ncmstringCódigo de classificação fiscal NCM (Nomenclatura Comum do Mercosul, ex.: 21.00.21.32).

data.menu.modifierGroups[n]

CampoTipoDescrição
modifierIdstringIdentificador do grupo de modificadores
modifierstringNome de exibição do grupo
minOptionsnumberNúmero mínimo de seleções obrigatórias
maxOptionsnumberNúmero máximo de seleções permitidas
typestringTipo de seleção: RADIO (single) ou CHECKBOX (multiple)
modifierOptionsobject[]Opções individuais do grupo — cada productId deve existir em products

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

CampoTipoDescrição
optionIdstringIdentificador da opção
productIdstringProduto usado como esta opção
namestringNome da opção
positionnumberOrdem 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].productId deve referenciar um produto definido em menu.products.
  • Os campos schedules em list, categorias e produtos sempre estão presentes no payload. Use null quando não houver horário aplicável; nunca omita a chave.
  • list.schedules: herança fulfillment → canal → salesScheduleoperationSchedulenull.
  • categories[].schedules: horário próprio da categoria se existir; null se não houver.
  • products[].schedules: apenas quando o produto tem schedule mode: custom; null se usa horário da loja ou não tem horário customizado (herda a janela do list implicitamente).

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 evento menu.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": []
    }
  }
}

Uso

Consulte o guia Publicação de menu para o fluxo completo de processamento.