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

# Subcategorías anidadas

> Sync de menú simple con una categoría padre y dos subcategorías.

Este ejemplo muestra el **árbol de categorías** más pequeño útil: una sección raíz con dos subcategorías hijas, cada una con un producto. No hay grupos de modificadores — solo estructura de navegación.

Úsalo cuando quieras secciones de browse como **Comida → Hamburguesas / Acompañamientos** sin complicar el payload.

## Qué incluye este ejemplo

| Entidad | Cantidad | Propósito |
| - | - | - |
| Productos | 2 | Una hamburguesa y un acompañamiento |
| Categorías | 3 | Una categoría raíz y dos subcategorías anidadas |
| Grupos de modificadores | 0 | Ninguno — solo estructura |
| Menús | 1 | Menú delivery todo el día vinculado a la categoría raíz |

```mermaid theme={null}
flowchart TB
    MENU["all-day-delivery"]
    MENU --> FOOD["food"]
    FOOD --> BURGERS["burgers"]
    FOOD --> SIDES["sides"]
    BURGERS --> BURGER["classic-burger"]
    SIDES --> FRIES["fries"]
```

## Request

Llama a [Upsert menus](https://firespark.cloud/docs/es/integrations-api/menus/put.md) con `style: DEFAULT`. Anida subcategorías agregando entradas con `"type": "CATEGORY"` en el array `items` de la categoría padre. Lista productos solo en las categorías **hoja**.

```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 @nested-categories.json
```

```json nested-categories.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",
      "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": [],
        "modifiers": []
      },
      "availability": {
        "status": "AVAILABLE",
        "schedules": null,
        "out_of_stock_until": null
      },
      "metadata": {}
    },
    {
      "id": "fries",
      "name": { "es_ec": "Papas fritas" },
      "description": { "es_ec": "Papas crujientes con sazón de la casa." },
      "image_url": "https://cdn.example.com/fries.jpg",
      "bundled_items": [],
      "pricing": {
        "minimum_quantity": 1,
        "maximum_quantity": 10,
        "is_tax_inclusive": true,
        "tax_rate": 0.15,
        "price": 4.99,
        "anchor_price": 4.99,
        "anchor_price_percentage": 0,
        "modifier_group_ids": [],
        "modifiers": []
      },
      "availability": {
        "status": "AVAILABLE",
        "schedules": null,
        "out_of_stock_until": null
      },
      "metadata": {}
    }
  ],
  "categories": [
    {
      "id": "food",
      "name": { "es_ec": "Comida" },
      "description": { "es_ec": "Navega por sección" },
      "items": [
        { "type": "CATEGORY", "id": "burgers" },
        { "type": "CATEGORY", "id": "sides" }
      ],
      "availability": {
        "status": "ACTIVE",
        "schedules": null,
        "out_of_stock_until": null
      },
      "metadata": {}
    },
    {
      "id": "burgers",
      "name": { "es_ec": "Hamburguesas" },
      "description": { "es_ec": "Hamburguesas de res y pollo" },
      "items": [{ "type": "PRODUCT", "id": "classic-burger" }],
      "availability": {
        "status": "ACTIVE",
        "schedules": null,
        "out_of_stock_until": null
      },
      "metadata": {}
    },
    {
      "id": "sides",
      "name": { "es_ec": "Acompañamientos" },
      "description": { "es_ec": "Sides y snacks" },
      "items": [{ "type": "PRODUCT", "id": "fries" }],
      "availability": {
        "status": "ACTIVE",
        "schedules": null,
        "out_of_stock_until": null
      },
      "metadata": {}
    }
  ],
  "modifier_groups": [],
  "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": ["food"],
      "status": "ACTIVE"
    }
  ]
}
```

## Puntos clave

* **Vincula el menú solo a la raíz.** `menus[].category_ids` lista `food`. Fire spark resuelve las categorías anidadas desde ahí.
* **Usa `type: CATEGORY` para anidar.** La categoría padre `food` no lista productos directamente — apunta a `burgers` y `sides`.
* **Coloca productos en categorías hoja.** `classic-burger` y `fries` aparecen en `items` con `"type": "PRODUCT"` en las subcategorías que abre el cliente.
* **El orden importa.** El orden en `items` es el orden de display dentro de cada categoría.
* **Límite de profundidad.** El anidamiento soporta hasta **3 niveles** incluyendo la raíz vinculada al menú. Este ejemplo usa dos niveles de categoría bajo el menú.

## Relacionado

> [card] [Menú simple](https://firespark.cloud/docs/es/integrations-api/examples/menu-sync/simple-menu.md)
>
> Categoría plana con grupos de modificadores

> [card] [Categorías](https://firespark.cloud/docs/es/concepts/categories.md)
>
> Cómo funcionan las subcategorías a nivel comercial

> [card] [Guía de sync de menú](https://firespark.cloud/docs/es/integrations-api/guides/menu-sync.md)
>
> Reglas de validación completas

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


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