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

# Get menus

> Get the composed menus available to the customer for a store, channel, and fulfillment context.

Returns every menu available for the customer's current selling context. Pass `fulfillment_id`, `store_id`, `channel_id`, and `brand_id` to load catalogs for that combination. When any parameter is omitted, or when no menu exists for the combination, Fire spark falls back to the merchant-wide default menu (`fulfillment_id`, `store_id`, `channel_id`, and `brand_id` all `__ANY__`).

When multiple menus share the same context and their schedules match the current time, Fire spark returns all of them in `data`. Menus with `schedules: null` are always available.

When no menu is currently in schedule, Fire spark returns every menu in `data` whose next availability window is closest to the current time. If several menus share that same next start time, all of them are returned.

<Note>
  Requires a Fire spark access token obtained through [token
  exchange](/docs/storefront-api/oauth/exchange/post). The token scopes requests to the
  authenticated customer and merchant.
</Note>

## Query parameters

| Parameter        | Required | Description                                                                                                                                                        |
| ---------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `fulfillment_id` | No       | External fulfillment identifier (for example `delivery`, `pickup`). Alphanumeric characters, `_`, and `-` only. 1–64 characters. Omit to receive the default menu. |
| `store_id`       | No       | External store identifier. Alphanumeric characters, `_`, and `-` only. 1–64 characters. Omit to receive the default menu.                                          |
| `channel_id`     | No       | External channel identifier. Alphanumeric characters, `_`, and `-` only. 1–64 characters. Omit to receive the default menu.                                        |
| `brand_id`       | No       | External brand identifier. Alphanumeric characters, `_`, and `-` only. 1–64 characters. Omit to receive the default menu.                                          |

## Request

```bash theme={null}
curl "https://firespark.cloud/api/storefront/v1/menus?fulfillment_id=delivery&store_id=downtown&channel_id=app&brand_id=0001" \
  -H "Authorization: Bearer ACCESS_TOKEN"
```

## Response

The response wraps an array of menu objects in `data`. Only `ACTIVE` menus are returned. When at least one menu is in schedule now, every matching menu is included. Otherwise, Fire spark includes the menu or menus whose next scheduled window starts soonest.

<ResponseExample>
  ```json Success theme={null}
  {
    "data": [
      {
        "id": "lunch-delivery",
        "uid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
        "brand_id": null,
        "organization_id": "11111111-1111-1111-1111-111111111111",
        "merchant_id": "22222222-2222-2222-2222-222222222222",
        "store_id": "downtown",
        "store_uid": "b2c3d4e5-f6a7-8901-bcde-f12345678901",
        "channel_id": "app",
        "channel_uid": "c3d4e5f6-a7b8-9012-cdef-123456789012",
        "fulfillment_id": "delivery",
        "fulfillment_uid": "d4e5f6a7-b8c9-0123-def4-567890abcdef",
        "name": { "en_us": "Lunch delivery menu" },
        "description": { "en_us": "Weekday lunch items for app delivery" },
        "schedules": [
          { "day_of_week": "monday", "periods": [{ "start_time": "11:00:00", "end_time": "15:00:00" }] },
          { "day_of_week": "tuesday", "periods": [{ "start_time": "11:00:00", "end_time": "15:00:00" }] },
          { "day_of_week": "wednesday", "periods": [{ "start_time": "11:00:00", "end_time": "15:00:00" }] },
          { "day_of_week": "thursday", "periods": [{ "start_time": "11:00:00", "end_time": "15:00:00" }] },
          { "day_of_week": "friday", "periods": [{ "start_time": "11:00:00", "end_time": "15:00:00" }] }
        ],
        "products": [
          {
            "id": "burger-classic",
            "name": { "en_us": "Classic burger" },
            "description": { "en_us": "Angus beef patty with lettuce and tomato." },
            "image_url": "https://cdn.example.com/burger-classic.jpg",
            "cms_template_id": null,
            "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,
              "modifiers": [],
              "modifier_group_ids": ["choose-drink"]
            },
            "availability": {
              "status": "AVAILABLE",
              "schedules": null,
              "out_of_stock_until": null
            },
            "metadata": {}
          },
          {
            "id": "soda",
            "name": { "en_us": "Soda" },
            "description": null,
            "image_url": null,
            "cms_template_id": 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,
              "modifiers": [],
              "modifier_group_ids": []
            },
            "availability": {
              "status": "AVAILABLE",
              "schedules": null,
              "out_of_stock_until": null
            },
            "metadata": {}
          },
          {
            "id": "cola",
            "name": { "en_us": "Cola" },
            "description": null,
            "image_url": null,
            "cms_template_id": 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,
              "modifiers": [],
              "modifier_group_ids": []
            },
            "availability": {
              "status": "AVAILABLE",
              "schedules": null,
              "out_of_stock_until": null
            },
            "metadata": {}
          }
        ],
        "categories": [
          {
            "id": "mains",
            "name": { "en_us": "Mains" },
            "description": { "en_us": "Burgers and sandwiches" },
            "cms_template_id": null,
            "status": "ACTIVE",
            "items": [{ "type": "PRODUCT", "id": "e5f6a7b8-c9d0-1234-ef56-789012345678" }],
            "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", "soda"],
            "minimum_quantity": 0,
            "maximum_quantity": 1,
            "charge_above_quantity": null,
            "metadata": {}
          }
        ],
        "metadata": {},
        "cms_template_id": null,
        "cms": null,
        "status": "ACTIVE",
        "release": "v2026-07-10-21h"
      }
    ]
  }
  ```
</ResponseExample>

## Menu object

| Field             | Type           | Description                                                                                              |
| ----------------- | -------------- | -------------------------------------------------------------------------------------------------------- |
| `id`              | string         | External menu identifier. Alphanumeric characters, `_`, and `-` only. 1–64 characters.                   |
| `uid`             | string (UUID)  | Fire spark internal identifier.                                                                          |
| `brand_id`        | string \| null | External brand identifier. `null` when the resource is not brand-scoped.                                 |
| `organization_id` | string (UUID)  | Fire spark organization identifier.                                                                      |
| `merchant_id`     | string (UUID)  | Fire spark merchant identifier.                                                                          |
| `store_id`        | string         | External store identifier.                                                                               |
| `store_uid`       | string (UUID)  | Fire spark store identifier.                                                                             |
| `channel_id`      | string         | External channel identifier.                                                                             |
| `channel_uid`     | string (UUID)  | Fire spark channel identifier.                                                                           |
| `fulfillment_id`  | string         | External fulfillment identifier.                                                                         |
| `fulfillment_uid` | string (UUID)  | Fire spark fulfillment identifier.                                                                       |
| `name`            | object         | Localized display name keyed by locale (for example `en_us`). Each value is 1–1024 characters.           |
| `description`     | object \| null | Localized description keyed by locale. `null` when omitted. Each value is 1–1024 characters.             |
| `schedules`       | array \| null  | Weekly schedule entries. `null` when there is no schedule restriction.                                   |
| `products`        | array          | Products in this menu. Use [Get product](/docs/storefront-api/menus/products/\[id]/get) for full detail.      |
| `categories`      | array          | Categories in this menu. Use [Get category](/docs/storefront-api/menus/categories/\[id]/get) for full detail. |
| `modifier_groups` | array          | Modifier groups referenced by products in this menu.                                                     |
| `metadata`        | object         | Partner-specific metadata. Defaults to `{}`.                                                             |
| `cms_template_id` | string (UUID)  | CMS template linked to this menu. `null` when no template is assigned.                                   |
| `cms`             | object         | Read-only. Resolved CMS template when `cms_template_id` is set.                                          |
| `status`          | string         | `ACTIVE` or `INACTIVE`. Only `ACTIVE` menus are returned.                                                |
| `release`         | string         | Release id that published this menu.                                                                     |

<AccordionGroup>
  <Accordion title="schedules">
    An array of schedule entries, or `null` when there is no schedule restriction. Each entry represents one day of the week:

    | Field         | Required | Type   | Description                                                   |
    | ------------- | -------- | ------ | ------------------------------------------------------------- |
    | `day_of_week` | Yes      | string | `monday` through `sunday`.                                    |
    | `periods`     | Yes      | array  | One or more time windows when the menu is active on that day. |

    Each period:

    | Field        | Required    | Type           | Description                                                                              |
    | ------------ | ----------- | -------------- | ---------------------------------------------------------------------------------------- |
    | `closed`     | No          | boolean        | `true` when this period is closed. Defaults to `false`.                                  |
    | `start_time` | Conditional | string         | ISO time (for example `11:00:00`). Required unless `closed` is `true`.                   |
    | `end_time`   | Conditional | string         | ISO time (for example `15:00:00`). Required unless `closed` is `true`.                   |
    | `start_date` | No          | string \| null | ISO 8601 datetime, or `null` for the always-on fallback. Set together with `end_date`.   |
    | `end_date`   | No          | string \| null | ISO 8601 datetime, or `null` for the always-on fallback. Set together with `start_date`. |
  </Accordion>

  <Accordion title="products">
    Each product in a composed menu includes catalog fields plus context-specific pricing and availability:

    | Field             | Required | Type           | Description                                                               |
    | ----------------- | -------- | -------------- | ------------------------------------------------------------------------- |
    | `id`              | Yes      | string         | External product identifier.                                              |
    | `name`            | Yes      | object         | Localized display name keyed by locale (for example `en_us`).             |
    | `description`     | No       | object \| null | Localized description. `null` when omitted.                               |
    | `image_url`       | No       | string         | Product image URL. `null` when omitted.                                   |
    | `cms_template_id` | No       | string (UUID)  | CMS template linked to this product. `null` when not assigned.            |
    | `status`          | Yes      | string         | `ACTIVE` or `INACTIVE`.                                                   |
    | `bundled_items`   | No       | array          | Items included in a bundle or combo. Defaults to `[]`.                    |
    | `pricing`         | Yes      | object         | Price, tax, quantity limits, and modifier configuration. See **pricing**. |
    | `availability`    | Yes      | object         | Product availability. See fields below.                                   |
    | `metadata`        | No       | object         | Partner-specific metadata. Defaults to `{}`.                              |

    Each `availability` object:

    | Field                | Required | Type          | Description                                                                                      |
    | -------------------- | -------- | ------------- | ------------------------------------------------------------------------------------------------ |
    | `status`             | Yes      | string        | `AVAILABLE`, `UNAVAILABLE`, or `OUT_OF_STOCK`.                                                   |
    | `schedules`          | No       | array \| null | Schedule entries with `day_of_week` and `periods`. `null` when there is no schedule restriction. |
    | `out_of_stock_until` | No       | string        | Optional ISO 8601 datetime when the product returns to stock.                                    |

    Each `bundled_items` entry:

    | Field               | Required | Type   | Description                                                             |
    | ------------------- | -------- | ------ | ----------------------------------------------------------------------- |
    | `id`                | Yes      | string | External identifier of the bundled product.                             |
    | `refund_price`      | Yes      | number | Refund amount when the customer removes this item from the bundle. ≥ 0. |
    | `included_quantity` | Yes      | number | Units included by default. ≥ 0.                                         |

    ```json Example product theme={null}
    {
      "id": "burger-classic",
      "name": { "en_us": "Classic burger" },
      "description": { "en_us": "Angus beef patty with lettuce and tomato." },
      "image_url": "https://cdn.example.com/burger-classic.jpg",
      "cms_template_id": null,
      "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,
        "modifiers": [],
        "modifier_group_ids": ["choose-drink"]
      },
      "availability": {
        "status": "AVAILABLE",
        "schedules": null,
        "out_of_stock_until": null
      },
      "metadata": {}
    }
    ```
  </Accordion>

  <Accordion title="categories">
    Each category in a composed menu:

    | Field             | Required | Type           | Description                                                     |
    | ----------------- | -------- | -------------- | --------------------------------------------------------------- |
    | `id`              | Yes      | string         | External category identifier.                                   |
    | `name`            | Yes      | object         | Localized display name keyed by locale.                         |
    | `description`     | No       | object \| null | Localized description. `null` when omitted.                     |
    | `cms_template_id` | No       | string (UUID)  | CMS template linked to this category. `null` when not assigned. |
    | `status`          | Yes      | string         | `ACTIVE` or `INACTIVE`.                                         |
    | `items`           | No       | array          | Ordered category entries. Defaults to `[]`.                     |
    | `availability`    | Yes      | object         | Category availability. See fields below.                        |
    | `metadata`        | No       | object         | Partner-specific metadata. Defaults to `{}`.                    |

    Each entry in `items`:

    | Field  | Required | Type   | Description                              |
    | ------ | -------- | ------ | ---------------------------------------- |
    | `type` | Yes      | string | `CATEGORY` or `PRODUCT`.                 |
    | `id`   | Yes      | string | External category or product identifier. |

    Each `availability` object:

    | Field                | Required | Type          | Description                                                                                      |
    | -------------------- | -------- | ------------- | ------------------------------------------------------------------------------------------------ |
    | `status`             | Yes      | string        | `AVAILABLE`, `UNAVAILABLE`, or `OUT_OF_STOCK`.                                                   |
    | `schedules`          | No       | array \| null | Schedule entries with `day_of_week` and `periods`. `null` when there is no schedule restriction. |
    | `out_of_stock_until` | No       | string        | Optional ISO 8601 datetime when the product returns to stock.                                    |

    ```json Example category theme={null}
    {
      "id": "mains",
      "name": { "en_us": "Mains" },
      "description": { "en_us": "Burgers and sandwiches" },
      "cms_template_id": null,
      "status": "ACTIVE",
      "items": [{ "type": "PRODUCT", "id": "e5f6a7b8-c9d0-1234-ef56-789012345678" }],
      "availability": {
        "status": "AVAILABLE",
        "schedules": null,
        "out_of_stock_until": null
      },
      "metadata": {}
    }
    ```
  </Accordion>

  <Accordion title="modifier_groups">
    Each modifier group in a composed menu:

    | Field                   | Required | Type           | Description                                                                       |
    | ----------------------- | -------- | -------------- | --------------------------------------------------------------------------------- |
    | `id`                    | Yes      | string         | External modifier group identifier. Referenced from `pricing.modifier_group_ids`. |
    | `title`                 | Yes      | object         | Localized group title keyed by locale.                                            |
    | `description`           | No       | object \| null | Localized description. `null` when omitted.                                       |
    | `display_type`          | No       | string         | `GRID` or `LIST`.                                                                 |
    | `modifier_ids`          | Yes      | array          | Product UUIDs for modifiers in this group. At least 2 entries.                    |
    | `minimum_quantity`      | Yes      | number         | Minimum selections required. ≥ 0.                                                 |
    | `maximum_quantity`      | Yes      | number         | Maximum selections allowed. 0–1,000,000.                                          |
    | `charge_above_quantity` | No       | number         | Number of free selections before additional charges apply. Optional.              |
    | `metadata`              | No       | object         | Partner-specific metadata. Defaults to `{}`.                                      |

    ```json Example modifier group theme={null}
    {
      "id": "choose-drink",
      "title": { "en_us": "Choose a drink" },
      "description": null,
      "display_type": "LIST",
      "modifier_ids": ["cola", "soda"],
      "minimum_quantity": 0,
      "maximum_quantity": 1,
      "charge_above_quantity": null,
      "metadata": {}
    }
    ```
  </Accordion>

  <Accordion title="pricing">
    Product pricing in a composed menu:

    | Field                     | Required | Type    | Description                                                                     |
    | ------------------------- | -------- | ------- | ------------------------------------------------------------------------------- |
    | `minimum_quantity`        | Yes      | number  | Minimum units per order. ≥ 0.                                                   |
    | `maximum_quantity`        | Yes      | number  | Maximum units per order. 0–1,000,000.                                           |
    | `is_tax_inclusive`        | Yes      | boolean | Whether `price` includes tax.                                                   |
    | `tax_rate`                | Yes      | number  | Tax rate as a decimal (for example `0.15` for 15%). 0–1.                        |
    | `price`                   | Yes      | number  | List price. ≥ 0.                                                                |
    | `anchor_price`            | Yes      | number  | Reference price for strikethrough or comparison. ≥ 0.                           |
    | `anchor_price_percentage` | Yes      | number  | Discount shown relative to `anchor_price`. 0–1.                                 |
    | `modifiers`               | No       | array   | Per-modifier pricing overrides. Defaults to `[]`.                               |
    | `modifier_group_ids`      | No       | array   | External modifier group identifiers attached to this product. Defaults to `[]`. |

    Each `modifiers` entry adds:

    | Field                   | Required | Type   | Description                                     |
    | ----------------------- | -------- | ------ | ----------------------------------------------- |
    | `modifier_group_id`     | Yes      | string | External modifier group identifier.             |
    | `default_quantity`      | Yes      | number | Pre-selected quantity. ≥ 0.                     |
    | `charge_above_quantity` | No       | number | Free selections before charges apply. Optional. |
    | `display_type`          | No       | string | `RADIO`, `CHECKBOX`, or `QUANTITY`.             |
  </Accordion>
</AccordionGroup>

## Error responses

| Status | Description                                                                               |
| ------ | ----------------------------------------------------------------------------------------- |
| `400`  | Missing or invalid query parameters.                                                      |
| `401`  | Missing or invalid access token.                                                          |
| `403`  | Token does not have access to this merchant's menus.                                      |
| `404`  | No active menu found for the requested context, and no menu has a future schedule window. |


## OpenAPI

````yaml storefront-api/openapi.json GET /menus
openapi: 3.0.1
info:
  title: Fire spark Storefront API
  description: Customer-facing channel endpoints for Fire spark.
  version: 1.0.0
servers:
  - url: https://firespark.cloud/api/storefront/v1
security:
  - bearerAuth: []
paths:
  /menus:
    get:
      summary: Get menus
      parameters:
        - in: query
          name: fulfillment_id
          required: false
          schema:
            type: string
            minLength: 1
            maxLength: 64
            pattern: ^[a-zA-Z0-9_-]+$
          description: External fulfillment identifier. Omit to receive the default menu.
        - in: query
          name: store_id
          required: false
          schema:
            type: string
            minLength: 1
            maxLength: 64
            pattern: ^[a-zA-Z0-9_-]+$
          description: External store identifier. Omit to receive the default menu.
        - in: query
          name: channel_id
          required: false
          schema:
            type: string
            minLength: 1
            maxLength: 64
            pattern: ^[a-zA-Z0-9_-]+$
          description: External channel identifier. Omit to receive the default menu.
        - in: query
          name: brand_id
          required: false
          schema:
            type: string
            minLength: 1
            maxLength: 64
            pattern: ^[a-zA-Z0-9_-]+$
          description: External brand identifier. Omit to receive the default menu.
      responses:
        '200':
          description: Ok
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: '#/components/schemas/Menu'
components:
  schemas:
    Menu:
      type: object
      properties:
        id:
          type: string
          minLength: 1
          maxLength: 64
          pattern: ^[a-zA-Z0-9_-]+$
        store_id:
          type: string
          minLength: 1
          maxLength: 64
          pattern: ^[a-zA-Z0-9_-]+$
        channel_id:
          type: string
          minLength: 1
          maxLength: 64
          pattern: ^[a-zA-Z0-9_-]+$
        fulfillment_id:
          type: string
          minLength: 1
          maxLength: 64
          pattern: ^[a-zA-Z0-9_-]+$
        name:
          $ref: '#/components/schemas/MultiLanguageText'
        products:
          type: array
          items:
            type: object
        categories:
          type: array
          items:
            type: object
    MultiLanguageText:
      type: object
      additionalProperties:
        type: string
      example:
        en_us: Example
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer

````