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

# Menú simple

> Sync mínima de menú — 3 productos, 1 categoría y 1 grupo de modificadores.

Este ejemplo muestra el catálogo más pequeño útil: un ítem vendible con un grupo de personalización y dos opciones modificadoras. Úsalo como plantilla antes de agregar horarios, modificadores anidados u overrides.

## Qué incluye este ejemplo

| Entidad | Cantidad | Propósito |
| - | - | - |
| Productos | 3 | Un ítem principal y dos bebidas modificadoras |
| Categorías | 1 | Sección de navegación con el producto principal |
| Grupos de modificadores | 1 | Elección obligatoria de bebida en la hamburguesa |
| Menús | 1 | Menú de delivery todo el día |

```mermaid theme={null}
flowchart TB
    CAT["mains"]
    CAT --> BURGER["classic-burger"]
    BURGER --> G1["choose-drink"]
    G1 --> COLA["cola"]
    G1 --> SPRITE["sprite"]
```

## Request

Llama a [Upsert menus](https://firespark.cloud/docs/es/integrations-api/menus/put.md) con `style: DEFAULT`. Los modificadores son productos regulares referenciados desde el array `modifier_ids` del grupo. Cada producto modificador lleva una entrada `pricing.modifiers` que describe cómo aparece dentro de ese grupo.

```bash theme={null}
curl --request PUT \
  --url 'https://firespark.cloud/api/integrations/v1/menus?fulfillment_id=delivery&store_id=downtown&channel_id=app&brand_id=0001' \
  -H "Authorization: Bearer ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d @simple-menu.json
```

```json simple-menu.json theme={null}
{
  "style": "DEFAULT",
  "products": [
    {
      "id": "classic-burger",
      "name": { "es_ec": "Hamburguesa clásica" },
      "description": { "es_ec": "Carne Angus con lechuga y tomate." },
      "image_url": "https://cdn.example.com/classic-burger.jpg",
      "status": "ACTIVE",
      "bundled_items": [],
      "pricing": {
        "minimum_quantity": 1,
        "maximum_quantity": 10,
        "is_tax_inclusive": true,
        "tax_rate": 0.15,
        "price": 12.99,
        "anchor_price": 14.99,
        "anchor_price_percentage": 0.13,
        "modifier_group_ids": ["choose-drink"],
        "modifiers": []
      },
      "availability": {
        "status": "AVAILABLE",
        "schedules": null,
        "out_of_stock_until": null
      },
      "metadata": {}
    },
    {
      "id": "cola",
      "name": { "es_ec": "Cola" },
      "description": null,
      "image_url": null,
      "status": "ACTIVE",
      "bundled_items": [],
      "pricing": {
        "minimum_quantity": 0,
        "maximum_quantity": 1,
        "is_tax_inclusive": true,
        "tax_rate": 0.15,
        "price": 0,
        "anchor_price": 0,
        "anchor_price_percentage": 0,
        "modifier_group_ids": [],
        "modifiers": [
          {
            "modifier_group_id": "choose-drink",
            "minimum_quantity": 0,
            "maximum_quantity": 1,
            "is_tax_inclusive": true,
            "tax_rate": 0.15,
            "price": 0,
            "anchor_price": 0,
            "anchor_price_percentage": 0,
            "default_quantity": 0,
            "charge_above_quantity": 0,
            "display_type": "RADIO"
          }
        ]
      },
      "availability": {
        "status": "AVAILABLE",
        "schedules": null,
        "out_of_stock_until": null
      },
      "metadata": {}
    },
    {
      "id": "sprite",
      "name": { "es_ec": "Sprite" },
      "description": null,
      "image_url": null,
      "status": "ACTIVE",
      "bundled_items": [],
      "pricing": {
        "minimum_quantity": 0,
        "maximum_quantity": 1,
        "is_tax_inclusive": true,
        "tax_rate": 0.15,
        "price": 0,
        "anchor_price": 0,
        "anchor_price_percentage": 0,
        "modifier_group_ids": [],
        "modifiers": [
          {
            "modifier_group_id": "choose-drink",
            "minimum_quantity": 0,
            "maximum_quantity": 1,
            "is_tax_inclusive": true,
            "tax_rate": 0.15,
            "price": 0,
            "anchor_price": 0,
            "anchor_price_percentage": 0,
            "default_quantity": 0,
            "charge_above_quantity": 0,
            "display_type": "RADIO"
          }
        ]
      },
      "availability": {
        "status": "AVAILABLE",
        "schedules": null,
        "out_of_stock_until": null
      },
      "metadata": {}
    }
  ],
  "categories": [
    {
      "id": "mains",
      "name": { "es_ec": "Platos principales" },
      "description": { "es_ec": "Hamburguesas y sándwiches" },
      "image_url": "https://cdn.example.com/mains.jpg",
      "status": "ACTIVE",
      "items": [{ "type": "PRODUCT", "id": "classic-burger" }],
      "availability": {
        "status": "AVAILABLE",
        "schedules": null,
        "out_of_stock_until": null
      },
      "metadata": {}
    }
  ],
  "modifier_groups": [
    {
      "id": "choose-drink",
      "title": { "es_ec": "Elige una bebida" },
      "description": null,
      "display_type": "LIST",
      "modifier_ids": ["cola", "sprite"],
      "minimum_quantity": 1,
      "maximum_quantity": 1,
      "charge_above_quantity": null,
      "metadata": {}
    }
  ],
  "menus": [
    {
      "id": "all-day-delivery",
      "name": { "es_ec": "Delivery todo el día" },
      "description": { "es_ec": "Menú estándar de delivery" },
      "schedules": null,
      "metadata": {},
      "category_ids": ["mains"],
      "status": "ACTIVE"
    }
  ]
}
```

## Puntos clave

* **Los modificadores son productos.** `cola` y `sprite` existen en `products` y se referencian desde `modifier_groups[].modifier_ids`.
* **Adjunta grupos en el padre.** `classic-burger` lista `choose-drink` solo en `pricing.modifier_group_ids`.
* **Configura modificadores en la opción.** Cada bebida lleva una entrada `pricing.modifiers` con `modifier_group_id: "choose-drink"` que describe precio y visualización dentro de ese grupo.
* **Las reglas del grupo viven en el grupo.** `minimum_quantity: 1` y `maximum_quantity: 1` exigen exactamente una bebida.
* **`schedules: null` significa 24/7.** Omite restricciones horarias en el menú base; agrega horarios solo cuando cambie la ordenabilidad.

## Relacionado

> [card] [Guía de sync de menús](https://firespark.cloud/docs/es/integrations-api/guides/menu-sync.md)
>
> Flujo completo de sync y modelo de composición

> [card] [Upsert menus](https://firespark.cloud/docs/es/integrations-api/menus/put.md)
>
> Referencia del endpoint


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.