> ## Documentation Index
> Fetch the complete documentation index at: https://docs.fire.rest/llms.txt
> Use this file to discover all available pages before exploring further.

# Publicação de cardápios

> Como tratar o evento menu.updated do Fire: quando é emitido, o que contém e como processá-lo.

Um cardápio no Fire é a definição completa do catálogo para uma combinação específica de loja e canal — categorias, produtos, grupos de modificadores e horários. Sempre que um cardápio muda, o Fire emite um evento `menu.updated` com o catálogo completo pronto para encaminhar downstream.

O payload é autocontido. Não é necessário chamar endpoints adicionais para obter os dados do cardápio — tudo já vem incluído.

## Processamento

<Steps>
  <Step title="Verifique a assinatura">
    Extraia o header `X-Fire-Signature` e valide-o contra o body bruto da requisição usando o signing secret da sua integração. O secret é gerado ao registrar o endpoint no dashboard do Fire em **Integrações de agregadores**. Veja [Autenticação](/pt/authentication) para o processo de verificação completo.
  </Step>

  <Step title="Confirme imediatamente">
    Retorne `200 OK` antes de qualquer processamento. O Fire reenviará se não receber resposta a tempo.
  </Step>

  <Step title="Identifique o cardápio">
    Use `data.menu.list.storeId` e `data.menu.list.channelId` para determinar a qual loja e canal este cardápio pertence.
  </Step>

  <Step title="Substitua o cardápio completo">
    Aplique `data.menu` como substituição total no seu sistema downstream. Não é um diff — sobrescreva o estado anterior por completo.
  </Step>
</Steps>

<Warning>
  O payload é um **cardápio completo**, não um diff. Substitua o cardápio inteiro no sistema downstream sempre que receber este evento.
</Warning>

## Payload

```json theme={null}
{
  "event": {
    "id": "evt_def456",
    "type": "menu.updated",
    "executionId": "exec_abc123",
    "createdAt": "2025-01-15T14:31:00.000Z"
  },
  "data": {
    "account": "1",
    "country": "BR",
    "groupId": "a3f7c2d1-84be-4e10-9b3a-2c5d6e7f8091",
    "menu": {
      "list": {
        "listId": "805-iFood-delivery",
        "listName": "iFood - Store 805",
        "storeId": "805",
        "channelId": "0E049503-85CF-E511-80C6-000D3A3261F3",
        "channelReferenceName": "iFood",
        "schedules": [ ... ]
      },
      "categories": [ ... ],
      "products": [ ... ],
      "modifierGroups": [ ... ]
    }
  }
}
```

Veja [`menu.updated`](/pt/webhook-reference/menu-updated) para o esquema completo com todos os campos e tipos.

## Estrutura do cardápio

### `data.menu.list`

Identifica a qual loja e canal o cardápio pertence. Use `storeId` e `channelId` como chave para fazer upsert no seu sistema downstream.

O campo `schedules` em `list` define as janelas de tempo em que o cardápio está ativo. Sempre presente; `null` se nenhum horário estiver definido.

### `data.menu.categories`

Lista de categorias visíveis. Cada categoria inclui `productListing` — um array com os `productId` de seus produtos e suas posições de exibição.

As categorias também podem ter `schedules` próprios que restringem sua visibilidade a determinados horários, independentemente do horário do cardápio.

### `data.menu.products`

Lista plana de todos os itens do cardápio — tanto produtos principais quanto opções usadas em grupos de modificadores. O campo `type` indica o papel de cada item:

| Tipo         | Descrição                                              |
| ------------ | ------------------------------------------------------ |
| `PRODUCT`    | Item principal vendável                                |
| `MODIFIER`   | Opção de modificador (ex.: tamanho, ingrediente extra) |
| `COMPLEMENT` | Complemento incluído na seleção                        |
| `COMBO`      | Produto cujo preço depende das seleções do cliente     |

Para produtos `COMBO`, `priceInfo.price` é sempre `0`. Use `priceInfo.referencePrice` como preço de cabeçalho. Os grupos de modificadores de um combo podem incluir `overrides` de preço por opção.

Veja o guia [Estrutura de produtos](/pt/guides/combo-products) para o tratamento completo de COMBOs e overrides de modificadores.

### `data.menu.modifierGroups`

Define os grupos de opções e suas regras de seleção. Cada grupo referencia suas opções via `productId`, que deve existir em `products`.

| Campo        | Descrição                                              |
| ------------ | ------------------------------------------------------ |
| `minOptions` | Mínimo de seleções obrigatórias (`0` = grupo opcional) |
| `maxOptions` | Máximo de seleções permitidas                          |
| `type`       | `RADIO` (uma opção) ou `CHECKBOX` (múltiplas)          |

## groupId

Eventos emitidos na mesma publicação compartilham o mesmo `groupId`. Você pode usá-lo para correlacionar eventos relacionados, mas não é necessário para processá-los — cada um é independente e autocontido.

## Remover um cardápio

O Fire não emite um evento de exclusão separado. Para sinalizar a remoção de um cardápio, o Fire envia um `menu.updated` com `categories`, `products` e `modifierGroups` como arrays vazios. Trate um cardápio vazio como sinal para desativá-lo ou removê-lo no seu sistema downstream.

## Idempotência

Você pode receber o mesmo evento mais de uma vez devido a retentativas. Como cada payload é uma substituição completa, aplicá-lo duas vezes produz o mesmo resultado.
