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

# List menus

> List the store's ternas (channel × fulfillment type) that have a generated menu, without the menu body.

<Warning>
  **Coming soon.** The design is closed but this endpoint is not implemented yet. This page
  describes the agreed contract so integrators can plan against it ahead of release.
</Warning>

A menu in Fire is not a property of the store: it belongs to a **terna** — store × sales channel ×
fulfillment type (for example, `KIOSK` / `DINE_IN`). The same product can price differently across
ternas of the same store, so there is no single "the store's menu" to return. This endpoint lists
which ternas of a store currently have a generated menu; use [Get menu](/en/api-reference/get-menu)
to read one.

## Authentication

<ParamField header="x-api-key" type="string" required>
  Your Fire API key with the `menu:read` scope. The key **must be vendor-scoped** (account + vendor
  binding) — keys without a `vendorId` are rejected with `403`.
</ParamField>

## Path parameters

<ParamField path="storeId" type="string" required>
  Store UUID (`stores.id`).
</ParamField>

## Request

<RequestExample>
  ```http theme={null}
  GET https://api.fire.rest/api/v1/fire/external/stores/550e8400-e29b-41d4-a716-446655440000/menus
  x-api-key: <your_api_key>
  ```
</RequestExample>

## Response

<ResponseField name="menus" type="object[]">
  <Expandable title="menu">
    <ResponseField name="channel" type="string">Sales channel code (e.g. `KIOSK`).</ResponseField>
    <ResponseField name="fulfillmentType" type="string">Fulfillment type code (e.g. `DINE_IN`, `TAKEAWAY`).</ResponseField>
    <ResponseField name="syncStatus" type="string">`SYNCED` | `FAILED` | `PENDING` — the last delivery attempt of this terna's generated menu.</ResponseField>
    <ResponseField name="generatedAt" type="string">ISO 8601 timestamp of the last menu generation for this terna.</ResponseField>
    <ResponseField name="syncedAt" type="string | null">ISO 8601 timestamp of the last **successful** delivery to the channel. `null` if it never synced. See [`syncedAt` semantics](/en/api-reference/get-menu#syncedat-semantics).</ResponseField>
  </Expandable>
</ResponseField>

<ResponseExample>
  ```json 200 theme={null}
  {
    "success": true,
    "data": {
      "menus": [
        {
          "channel": "KIOSK",
          "fulfillmentType": "DINE_IN",
          "syncStatus": "SYNCED",
          "generatedAt": "2026-09-28T10:00:00Z",
          "syncedAt": "2026-09-28T10:00:04Z"
        },
        {
          "channel": "KIOSK",
          "fulfillmentType": "TAKEAWAY",
          "syncStatus": "FAILED",
          "generatedAt": "2026-09-28T10:00:00Z",
          "syncedAt": null
        }
      ]
    }
  }
  ```

  ```json 401 — invalid API key theme={null}
  {
    "success": false,
    "error": "UNAUTHORIZED",
    "message": "Invalid or missing API key"
  }
  ```

  ```json 403 — key without the scope theme={null}
  {
    "success": false,
    "error": "FORBIDDEN",
    "message": "API key does not have required scope: menu:read"
  }
  ```

  ```json 404 — the store is not yours theme={null}
  {
    "success": false,
    "error": "NOT_FOUND",
    "message": "Store not found"
  }
  ```
</ResponseExample>

## Notes

* Only ternas with a **generated** menu are listed (`generatedAt` not null) — including one whose
  last generation produced an empty send (see [Empty send](/en/api-reference/get-menu#empty-send)).
  That case still shows here, with `syncStatus: FAILED`, so the problem is visible.
* This listing never returns the menu body — it is built to skip the heavy payload column. Fetch a
  specific terna with [Get menu](/en/api-reference/get-menu).
* `channel` and `fulfillmentType` are compared case-insensitively against what you send to
  [Get menu](/en/api-reference/get-menu#query-parameters) — there is no separate id to look up.

## Related

<CardGroup cols={2}>
  <Card title="Get menu" icon="book-open" href="/en/api-reference/get-menu">
    Read a single terna's menu, with its sync status.
  </Card>

  <Card title="Get store" icon="store" href="/en/api-reference/get-store">
    Read a single store by id.
  </Card>
</CardGroup>
