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

# Simple menu

> Minimal menu sync — 3 products, 1 category, and 1 modifier group.

This example shows the smallest useful catalog: a sellable item with one customization group and two modifier options. Use it as a template before adding schedules, nested modifiers, or overrides.

## What this example includes

| Entity          | Count | Purpose                                 |
| --------------- | ----- | --------------------------------------- |
| Products        | 3     | One main item and two drink modifiers   |
| Categories      | 1     | Browse section listing the main product |
| Modifier groups | 1     | Required drink choice on the burger     |
| Menus           | 1     | All-day delivery menu                   |

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

## Request

Call [Upsert menus](/docs/integrations-api/menus/put) with `style: DEFAULT`. Modifiers are regular products referenced from the group's `modifier_ids` array. Each modifier product carries a `pricing.modifiers` entry describing how it appears inside that group.

```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": { "en_us": "Classic burger" },
      "description": { "en_us": "Angus beef patty with lettuce and tomato." },
      "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": { "en_us": "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": { "en_us": "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": { "en_us": "Mains" },
      "description": { "en_us": "Burgers and sandwiches" },
      "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": { "en_us": "Choose a drink" },
      "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": { "en_us": "All-day delivery" },
      "description": { "en_us": "Standard delivery menu" },
      "schedules": null,
      "metadata": {},
      "category_ids": ["mains"],
      "status": "ACTIVE"
    }
  ]
}
```

## Key points

* **Modifiers are products.** `cola` and `sprite` exist in `products` and are referenced from `modifier_groups[].modifier_ids`.
* **Attach groups on the parent.** `classic-burger` lists `choose-drink` in `pricing.modifier_group_ids` only.
* **Configure modifiers on the option.** Each drink carries a `pricing.modifiers` entry with `modifier_group_id: "choose-drink"` describing price and display inside that group.
* **Group rules live on the group.** `minimum_quantity: 1` and `maximum_quantity: 1` require exactly one drink.
* **Schedules null means 24/7.** Omit hour restrictions on the baseline menu; add schedules only when orderability changes.

## Related

<CardGroup cols={2}>
  <Card title="Menu sync guide" icon="book" href="/docs/integrations-api/guides/menu-sync">
    Full sync workflow and composition model
  </Card>

  <Card title="Upsert menus" icon="upload" href="/docs/integrations-api/menus/put">
    Endpoint reference
  </Card>
</CardGroup>
