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

# Get menu

> Returns the full menu for a syncId received in a menu.list_ready notification.

<Warning>
  **Proposal — not implemented in XMART\_BACKOFFICE yet.** See [Hybrid
  delivery](/en/hybrid-delivery/overview) for context. This page shows the intended
  shape of the endpoint, not a live contract.
</Warning>

The fetch half of [hybrid delivery](/en/hybrid-delivery/overview): call this after
receiving a [`menu.list_ready`](/en/hybrid-delivery/menu-list-ready) event to get the
full menu. The response shape mirrors `data.menu` in
[`menu.updated`](/en/webhook-reference/menu-updated) exactly — same fields, same
semantics.

<Info>
  The notify webhook and this fetch endpoint authenticate differently. Fire **pushes**
  `menu.list_ready` to your server, signed with HMAC — see [Request
  headers](/en/hybrid-delivery/overview#request-headers). Your system **pulls** this
  endpoint, so it needs an API credential instead — see below.
</Info>

## Authentication

This is a `/v1/*` endpoint — see [Authentication](/en/authentication#api-authentication):
only `x-api-key` is required, no login flow.

<ParamField header="x-api-key" type="string" required>
  Your Fire API key.
</ParamField>

<ParamField header="Authorization" type="string">
  Optional `Bearer <token>`, accepted as a legacy alternative to `x-api-key`. Send one or the other.
</ParamField>

## Path parameters

<ParamField path="syncId" type="string" required>
  The sync assignment's identifier, received as `data.syncId` in the
  [`menu.list_ready`](/en/hybrid-delivery/menu-list-ready) event. This is the id of
  the row that ties a store, channel, and fulfillment type to a menu and a price
  list — the same three values `listId` summarizes as a string, but this is the one
  guaranteed to be unique.
</ParamField>

## Response

<ResponseField name="source" type="object">
  Which menu and price list this response was resolved from. Compare against your
  last [`menu.list_ready`](/en/hybrid-delivery/menu-list-ready) to detect a
  reassignment between the notify event and this fetch.

  <Expandable title="source fields">
    <ResponseField name="menuId" type="string">
      UUID of the menu this response was flattened from.
    </ResponseField>

    <ResponseField name="priceListId" type="string">
      UUID of the price list used to resolve every price in this response. A menu
      has no price list of its own — each sync assignment (`syncId`) picks one, so
      the same menu can price differently depending on which assignment fetched it.
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="list" type="object">
  Menu metadata and channel/store association.

  <Expandable title="list fields">
    <ResponseField name="syncId" type="string">
      The sync assignment's own id — same value as the path parameter, echoed back.
    </ResponseField>

    <ResponseField name="listId" type="string">
      Legacy composite identifier: `{storeNumber}-{channelCode}-{fulfillmentType}`.
      Kept for cross-reference with [`menu.updated`](/en/webhook-reference/menu-updated);
      not guaranteed unique on its own.
    </ResponseField>

    <ResponseField name="listName" type="string">
      Auto-generated label `{channelCode} - Store {storeNumber}`.
    </ResponseField>

    <ResponseField name="vendorId" type="string | number">
      Brand code.
    </ResponseField>

    <ResponseField name="storeId" type="string">
      Internal store UUID (PK `stores.id`).
    </ResponseField>

    <ResponseField name="storeName" type="string">
      Store operational name.
    </ResponseField>

    <ResponseField name="timezone" type="string | null">
      Store IANA timezone (e.g. `America/Sao_Paulo`).
    </ResponseField>

    <ResponseField name="channelId" type="string">
      Internal sales channel UUID (PK `channels.id`).
    </ResponseField>

    <ResponseField name="channelReferenceName" type="string">
      Fulfillment reference name (e.g. `delivery`, `pickup`).
    </ResponseField>

    <ResponseField name="fulfillmentType" type="string">
      Fulfillment type code (e.g. `DELIVERY`, `DINE_IN`, `TAKEAWAY`). Part of the
      assignment's real identity, alongside `storeId` and `channelId`.
    </ResponseField>

    <ResponseField name="schedules" type="object[]">
      Time windows when this channel is active for this store. Empty array means the
      channel operates 24 hours.

      <Expandable title="schedule entry">
        <ResponseField name="day" type="string">
          `MONDAY`, `TUESDAY`, `WEDNESDAY`, `THURSDAY`, `FRIDAY`, `SATURDAY`, `SUNDAY`.
        </ResponseField>

        <ResponseField name="startTime" type="string">
          Opening time in `HH:mm` format.
        </ResponseField>

        <ResponseField name="endTime" type="string">
          Closing time in `HH:mm` format.
        </ResponseField>
      </Expandable>
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="categories" type="object[]">
  Menu categories.

  <Expandable title="category fields">
    <ResponseField name="productCategoryId" type="string">
      Category identifier.
    </ResponseField>

    <ResponseField name="name" type="string">
      Display name.
    </ResponseField>

    <ResponseField name="displayInList" type="boolean">
      Whether the category is visible.
    </ResponseField>

    <ResponseField name="featured" type="boolean">
      Whether the category is featured.
    </ResponseField>

    <ResponseField name="position" type="number">
      Display order.
    </ResponseField>

    <ResponseField name="images" type="object[]">
      Category images — `{ imageCategoryId, fileUrl }`.
    </ResponseField>

    <ResponseField name="assignedAt" type="string | null">
      Date the category joined the menu, in ISO 8601 UTC. Same semantics as
      [`menu.updated` → Menu assignment date](/en/webhook-reference/menu-updated#menu-assignment-date).
    </ResponseField>

    <ResponseField name="productListing" type="object[]">
      Products in this category with their positions — `{ productId, position }`.
    </ResponseField>

    <ResponseField name="schedules" type="object[] | null">
      Category-specific schedule. `null` if none is configured.
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="products" type="object[]">
  Product catalog.

  <Expandable title="product fields">
    <ResponseField name="productId" type="string | number">
      Product identifier (`externalId` or UUID).
    </ResponseField>

    <ResponseField name="name" type="string">
      Product name.
    </ResponseField>

    <ResponseField name="description" type="string">
      Product description.
    </ResponseField>

    <ResponseField name="active" type="boolean">
      Menu visibility (`visible`); does not reflect stock or operational availability.
    </ResponseField>

    <ResponseField name="type" type="string">
      Item type: `PRODUCTO`, `MODIFIER`, `COMPLEMENT`, `COMBO`.
    </ResponseField>

    <ResponseField name="priceInfo" type="object">
      Resolved product prices — `{ pointPrice, price, referencePrice, suggestedPrice }`.
    </ResponseField>

    <ResponseField name="productModifiers" type="object[]">
      Modifier group references — `{ modifierId, position, overrides? }`.
    </ResponseField>

    <ResponseField name="schedules" type="object[] | null">
      Product custom schedule. `null` if using store hours or no custom schedule.
    </ResponseField>

    <ResponseField name="images" type="object[]">
      Product images.
    </ResponseField>

    <ResponseField name="taxInfo" type="object[]">
      Tax information — `{ vatRatePercentage }`.
    </ResponseField>

    <ResponseField name="additionalInfo" type="object">
      Optional extra metadata — `{ externalCode, ncm, assignedAt }`.
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="modifierGroups" type="object[]">
  Modifier groups and options.

  <Expandable title="modifierGroups fields">
    <ResponseField name="modifierId" type="string">
      Modifier group identifier.
    </ResponseField>

    <ResponseField name="modifier" type="string">
      Display name of the modifier group.
    </ResponseField>

    <ResponseField name="minOptions" type="number">
      Minimum number of selections required.
    </ResponseField>

    <ResponseField name="maxOptions" type="number">
      Maximum number of selections allowed.
    </ResponseField>

    <ResponseField name="type" type="string">
      Selection type: `RADIO` (single) or `CHECKBOX` (multiple).
    </ResponseField>

    <ResponseField name="modifierOptions" type="object[]">
      Individual options — `{ optionId, productId, name, position }`.
    </ResponseField>
  </Expandable>
</ResponseField>

## Notes

* This endpoint returns the same shape documented field-by-field in
  [`menu.updated`](/en/webhook-reference/menu-updated#fields) — refer to that page for
  full descriptions, edge cases, and the [Menu assignment
  date](/en/webhook-reference/menu-updated#menu-assignment-date) rules.
* A `syncId` that doesn't exist, or whose assignment has been removed, should return `404`.
