> ## 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.

# Publicación de menús

> Cómo manejar el evento menu.updated de Fire: cuándo se emite, qué contiene y cómo procesarlo.

Un menú en Fire es la definición completa del catálogo para una combinación específica de tienda y canal — categorías, productos, grupos de modificadores y horarios. Cada vez que un menú cambia, Fire emite un evento `menu.updated` con el catálogo completo listo para reenviar downstream.

El payload es autocontenido. No necesitas consultar endpoints adicionales para obtener los datos del menú — todo viene incluido.

## Procesamiento

<Steps>
  <Step title="Verifica la firma">
    Extrae el header `X-Fire-Signature` y valídalo contra el body crudo usando el signing secret de tu integración. El secret se genera al registrar el endpoint en el dashboard de Fire bajo **Integraciones de agregadores**. Consulta [Autenticación](/es/authentication) para el proceso de verificación completo.
  </Step>

  <Step title="Confirma de inmediato">
    Devuelve `200 OK` antes de hacer cualquier procesamiento. Fire reintentará si no recibe respuesta a tiempo.
  </Step>

  <Step title="Identifica el menú">
    Usa `data.menu.list.storeId` y `data.menu.list.channelId` para determinar a qué tienda y canal pertenece el menú.
  </Step>

  <Step title="Reemplaza el menú completo">
    Aplica `data.menu` como reemplazo total en tu sistema downstream. No es un diff — sobreescribe el estado anterior por completo.
  </Step>
</Steps>

<Warning>
  El payload es un **menú completo**, no un diff. Reemplaza el menú entero en el sistema downstream cada vez que recibas 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": [ ... ]
    }
  }
}
```

Consulta [`menu.updated`](/es/webhook-reference/menu-updated) para el esquema completo con todos los campos y tipos.

## Estructura del menú

### `data.menu.list`

Identifica a qué tienda y canal pertenece el menú. Los campos clave son `storeId` y `channelId`, que debes usar como clave para hacer upsert en tu sistema downstream.

El campo `schedules` en `list` define las ventanas de tiempo en que el menú está activo. Siempre está presente; es `null` si no hay horario definido.

### `data.menu.categories`

Lista de categorías visibles. Cada categoría incluye `productListing` — un arreglo con los `productId` de sus productos y sus posiciones de visualización.

Las categorías también pueden tener `schedules` propios que restringen su visibilidad a ciertas horas del día, independientemente del horario del menú.

### `data.menu.products`

Lista plana de todos los ítems del menú — tanto productos principales como las opciones usadas en grupos de modificadores. El campo `type` indica el rol de cada ítem:

| Tipo         | Descripción                                                 |
| ------------ | ----------------------------------------------------------- |
| `PRODUCT`    | Ítem principal vendible                                     |
| `MODIFIER`   | Opción de modificador (p. ej. tamaño, ingrediente extra)    |
| `COMPLEMENT` | Complemento incluido en la selección                        |
| `COMBO`      | Producto cuyo precio depende de las selecciones del cliente |

Para productos `COMBO`, `priceInfo.price` es siempre `0`. Usa `priceInfo.referencePrice` como precio de encabezado. Los grupos de modificadores del combo pueden incluir `overrides` de precio por opción.

Consulta la guía [Estructura de productos](/es/guides/combo-products) para el manejo completo de COMBOs y overrides de modificadores.

### `data.menu.modifierGroups`

Define los grupos de opciones y sus reglas de selección. Cada grupo referencia sus opciones mediante `productId`, que debe existir en `products`.

| Campo        | Descripción                                             |
| ------------ | ------------------------------------------------------- |
| `minOptions` | Mínimo de selecciones requeridas (`0` = grupo opcional) |
| `maxOptions` | Máximo de selecciones permitidas                        |
| `type`       | `RADIO` (una opción) o `CHECKBOX` (múltiples)           |

## groupId

Los eventos emitidos en la misma publicación comparten el mismo `groupId`. Puedes usarlo para correlacionar eventos relacionados, pero no es necesario para procesarlos — cada uno es independiente y autocontenido.

## Eliminar un menú

Fire no emite un evento de borrado separado. Para señalar la eliminación de un menú, Fire envía un `menu.updated` con `categories`, `products` y `modifierGroups` como arrays vacíos. Trata un menú vacío como señal para desactivarlo o eliminarlo en tu sistema downstream.

## Idempotencia

Puedes recibir el mismo evento más de una vez por reintentos. Como cada payload es un reemplazo completo, aplicarlo dos veces produce el mismo resultado.
